summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tlillqvist@suse.com>2012-06-18 22:02:57 +0300
committerTor Lillqvist <tlillqvist@suse.com>2012-06-18 22:38:30 +0300
commit8dd75128a5a7e068ae63f3d1cc6b41410f7d7122 (patch)
tree5e6cda3558ffd41b3ebd1134d99251daa4ac8969
parent36244dcfa196c27a23a6eb4b20cc0b62507f6ed0 (diff)
ByteBufferWrapper tweaks
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
-rw-r--r--sal/inc/sal/ByteBufferWrapper.hxx23
-rw-r--r--touch/Library_libotouch.mk4
-rw-r--r--touch/source/android/android.cxx34
3 files changed, 44 insertions, 17 deletions
diff --git a/sal/inc/sal/ByteBufferWrapper.hxx b/sal/inc/sal/ByteBufferWrapper.hxx
index 954922d65b16..63bb618278d6 100644
--- a/sal/inc/sal/ByteBufferWrapper.hxx
+++ b/sal/inc/sal/ByteBufferWrapper.hxx
@@ -21,25 +21,14 @@ namespace org { namespace libreoffice { namespace touch {
class ByteBufferWrapper
{
private:
- JNIEnv *env;
- jobject object;
+ jobject object;
public:
- ByteBufferWrapper(JNIEnv *e, jobject o) :
- env(e)
- {
- object = env->NewGlobalRef(o);
- }
-
- sal_uInt8* pointer()
- {
- return (sal_uInt8 *) env->GetDirectBufferAddress(object);
- }
-
- void operator()(sal_uInt8 * /* p */)
- {
- env->DeleteGlobalRef(object);
- }
+ ByteBufferWrapper(JNIEnv *env, jobject o);
+
+ sal_uInt8* pointer();
+
+ void operator()(sal_uInt8 *p);
};
}; }; };
diff --git a/touch/Library_libotouch.mk b/touch/Library_libotouch.mk
index 1e06db466583..17d1f4529084 100644
--- a/touch/Library_libotouch.mk
+++ b/touch/Library_libotouch.mk
@@ -33,6 +33,10 @@ $(eval $(call gb_Library_add_exception_objects,libotouch,\
ifeq ($(OS),ANDROID)
+$(eval $(call gb_Library_use_libraries,libotouch,\
+ lo-bootstrap \
+))
+
$(eval $(call gb_Library_add_exception_objects,libotouch,\
touch/source/android/android \
))
diff --git a/touch/source/android/android.cxx b/touch/source/android/android.cxx
index 06768c86c646..3a116b18e643 100644
--- a/touch/source/android/android.cxx
+++ b/touch/source/android/android.cxx
@@ -10,9 +10,43 @@
#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