diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2014-11-17 10:47:02 +0100 |
---|---|---|
committer | Tomaž Vajngerl <tomaz.vajngerl@collabora.com> | 2014-12-04 23:04:27 +0100 |
commit | 515a8cf4005cb146052256ff4b9ac2de895849ae (patch) | |
tree | 86c186054e3c1343000656a287bc58635d7adfed /desktop | |
parent | 333a894ba84553762542c47636791f92360c69b5 (diff) |
android: use ByteBuffer to send or store pointers in JNI bindings
Using direct ByteBuffer is much nicer option to store or send
pointers between C(++) code and Java via JNI as it handles endiness
and pointer size for us. Using "long" type can have unexpected
results in 32-bit architectures (mostly Android). This was causing
grief especially when Android introduced support for 64-bit
architectures starting with SDK 19.
Change-Id: Ie92d0f913b668e1724e846d70d1820445d9cb086
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/lib/lokandroid.cxx | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/desktop/source/lib/lokandroid.cxx b/desktop/source/lib/lokandroid.cxx index 707996ed1c88..0f408ea6c020 100644 --- a/desktop/source/lib/lokandroid.cxx +++ b/desktop/source/lib/lokandroid.cxx @@ -25,21 +25,14 @@ jfieldID getHandleField(JNIEnv* pEnv, jobject aObject) { jclass clazz = pEnv->GetObjectClass(aObject); - return pEnv->GetFieldID(clazz, "handle", "J"); + return pEnv->GetFieldID(clazz, "handle", "Ljava/nio/ByteBuffer;"); } template <typename T> T* getHandle(JNIEnv* pEnv, jobject aObject) { - jlong aHandle = pEnv->GetLongField(aObject, getHandleField(pEnv, aObject)); - return reinterpret_cast<T*>(aHandle); -} - -template <typename T> -void setHandle(JNIEnv* pEnv, jobject aObject, T* aType) -{ - jlong aHandle = reinterpret_cast<jlong>(aType); - pEnv->SetLongField(aObject, getHandleField(pEnv, aObject), aHandle); + jobject aHandle = pEnv->GetObjectField(aObject, getHandleField(pEnv, aObject)); + return reinterpret_cast<T*>(pEnv->GetDirectBufferAddress(aHandle)); } const char* copyJavaString(JNIEnv* pEnv, jstring aJavaString) @@ -60,11 +53,6 @@ extern "C" SAL_JNI_EXPORT jstring JNICALL Java_org_libreoffice_kit_Office_getErr return pEnv->NewStringUTF(pError); } -extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Office_initialize(JNIEnv* pEnv, jobject aObject, jlong aLokHandle) -{ - pEnv->SetLongField(aObject, getHandleField(pEnv, aObject), aLokHandle); -} - extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Office_destroy(JNIEnv* pEnv, jobject aObject) { LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject); @@ -80,13 +68,15 @@ extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Office_destroyAn _exit(0); } -extern "C" SAL_JNI_EXPORT jlong JNICALL Java_org_libreoffice_kit_Office_documentLoadNative(JNIEnv* pEnv, jobject aObject, jstring documentPath) +extern "C" SAL_JNI_EXPORT jobject JNICALL Java_org_libreoffice_kit_Office_documentLoadNative(JNIEnv* pEnv, jobject aObject, jstring documentPath) { const char* aCloneDocumentPath = copyJavaString(pEnv, documentPath); LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject); LibreOfficeKitDocument* pDocument = pLibreOfficeKit->pClass->documentLoad(pLibreOfficeKit, aCloneDocumentPath); - return (jlong) pDocument; + jobject aHandle = pEnv->NewDirectByteBuffer((void*) pDocument, sizeof(LibreOfficeKitDocument)); + + return aHandle; } /* Document */ |