8dd75128a5
operator() gets called in a Java GC thread. A JNIEnv* saved in the constructor (which is called from the UI thread) is not valid in other threads (although for now, Dalvik notices, warns, and works around it). So don't bother keeping the JNIEnv*. Instead fetch one when needed. Move the method implementations from inline in the header to libotouch's android.cxx. Change-Id: I7de6fc54bb8d9a59146576d6e8c325fe917393ee
70 lines
1.9 KiB
C++
70 lines
1.9 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*
|
|
* Copyright 2012 LibreOffice contributors.
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
#include <jni.h>
|
|
|
|
#include <sal/ByteBufferWrapper.hxx>
|
|
#include <osl/detail/android-bootstrap.h>
|
|
|
|
using org::libreoffice::touch::ByteBufferWrapper;
|
|
|
|
static JNIEnv *get_env()
|
|
{
|
|
JavaVMAttachArgs args = {
|
|
JNI_VERSION_1_2,
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
JavaVM *jvm = lo_get_javavm();
|
|
JNIEnv *env = NULL;
|
|
|
|
jvm->AttachCurrentThread(&env, &args);
|
|
return env;
|
|
}
|
|
|
|
__attribute__ ((visibility("default")))
|
|
ByteBufferWrapper::ByteBufferWrapper(JNIEnv *env, jobject o)
|
|
{
|
|
object = env->NewGlobalRef(o);
|
|
}
|
|
|
|
__attribute__ ((visibility("default")))
|
|
sal_uInt8* ByteBufferWrapper::pointer()
|
|
{
|
|
return (sal_uInt8 *) get_env()->GetDirectBufferAddress(object);
|
|
}
|
|
|
|
__attribute__ ((visibility("default")))
|
|
void ByteBufferWrapper::operator()(sal_uInt8 * /* p */)
|
|
{
|
|
get_env()->DeleteGlobalRef(object);
|
|
}
|
|
|
|
extern "C"
|
|
__attribute__ ((visibility("default")))
|
|
jlong
|
|
Java_org_libreoffice_android_Bootstrap_new_1byte_1buffer_1wrapper(JNIEnv *env,
|
|
jobject /* clazz */,
|
|
jobject bytebuffer)
|
|
{
|
|
return (jlong) (intptr_t) new ByteBufferWrapper(env, bytebuffer);
|
|
}
|
|
|
|
extern "C"
|
|
__attribute__ ((visibility("default")))
|
|
void
|
|
Java_org_libreoffice_android_Bootstrap_delete_1byte_1buffer_1wrapper(JNIEnv * /* env */,
|
|
jobject /* clazz */,
|
|
jlong bbw)
|
|
{
|
|
delete (ByteBufferWrapper*) (intptr_t) bbw;
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|