android/Bootstrap/src/org/libreoffice/kit/Document.java | 16 +++ desktop/source/lib/lokandroid.cxx | 69 ++++++++++++++++ include/LibreOfficeKit/LibreOfficeKit.h | 28 ++++-- sal/android/lo-bootstrap.c | 2 4 files changed, 104 insertions(+), 11 deletions(-)
New commits: commit 1c4ba83a395dd105620c104a29cabdcc84675aad Author: Tomaž Vajngerl <[email protected]> Date: Wed Jan 7 19:37:53 2015 +0900 android: Add support for callbacks from LO to JNI and Java LOK This adds support to retrieve callbacks from LibreOffice (like for example that a part of document has been invalidated) to LibreOfficeKit JNI and Java wrappers. Change-Id: Ib70187194d002c72b64d58032aab216adc591565 diff --git a/android/Bootstrap/src/org/libreoffice/kit/Document.java b/android/Bootstrap/src/org/libreoffice/kit/Document.java index e415d8f..6985a7c 100644 --- a/android/Bootstrap/src/org/libreoffice/kit/Document.java +++ b/android/Bootstrap/src/org/libreoffice/kit/Document.java @@ -9,6 +9,8 @@ package org.libreoffice.kit; +import android.util.Log; + import java.nio.ByteBuffer; public class Document { @@ -28,8 +30,22 @@ public class Document { public Document(ByteBuffer handle) { this.handle = handle; + bindMessageCallback(); + } + + /** + * Callback triggered through JNI to indicate that a new singal + * from LibreOfficeKit was retrieved. + */ + private void messageRetrieved(int signalNumber, String payload) { + Log.i("Document", "Signal retrieved: " + signalNumber + " " + payload); } + /** + * Bind the signal callback in LOK. + */ + private native void bindMessageCallback(); + public native void destroy(); public native int getPart(); diff --git a/desktop/source/lib/lokandroid.cxx b/desktop/source/lib/lokandroid.cxx index 2b18071..06da8a9 100644 --- a/desktop/source/lib/lokandroid.cxx +++ b/desktop/source/lib/lokandroid.cxx @@ -22,6 +22,9 @@ /* LibreOfficeKit */ +namespace +{ + jfieldID getHandleField(JNIEnv* pEnv, jobject aObject) { jclass clazz = pEnv->GetObjectClass(aObject); @@ -46,6 +49,8 @@ const char* copyJavaString(JNIEnv* pEnv, jstring aJavaString) return pClone; } +} // anonymous namespace + extern "C" SAL_JNI_EXPORT jstring JNICALL Java_org_libreoffice_kit_Office_getError(JNIEnv* pEnv, jobject aObject) { LibreOfficeKit* pLibreOfficeKit = getHandle<LibreOfficeKit>(pEnv, aObject); @@ -68,6 +73,55 @@ extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Office_destroyAn _exit(0); } +namespace +{ + +struct CallbackData +{ + jmethodID aJavaCallbackMethod; + jclass aClass; + jobject aObject; +}; + +static CallbackData gCallbackData; + +/** + * Handle retrieved callback + */ +void messageCallback(int nType, const char* pPayload, void* pData) +{ + CallbackData* pCallbackData = (CallbackData*) pData; + + JavaVM* pJavaVM = lo_get_javavm(); + JNIEnv* pEnv; + bool bIsAttached = false; + + int status = pJavaVM->GetEnv((void **) &pEnv, JNI_VERSION_1_6); + + if(status < 0) + { + status = pJavaVM->AttachCurrentThread(&pEnv, NULL); + if(status < 0) + { + return; + } + bIsAttached = true; + } + + jvalue aParameter[2]; + aParameter[0].i = nType; + aParameter[1].l = pEnv->NewStringUTF(pPayload); + + pEnv->CallVoidMethodA(pCallbackData->aObject, pCallbackData->aJavaCallbackMethod, aParameter); + + if (bIsAttached) + { + pJavaVM->DetachCurrentThread(); + } +} + +} // anonymous namespace + 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); @@ -81,6 +135,21 @@ extern "C" SAL_JNI_EXPORT jobject JNICALL Java_org_libreoffice_kit_Office_docume /* Document */ +/** Implementation of org.libreoffice.kit.Document.bindMessageCallback method */ +extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Document_bindMessageCallback + (JNIEnv* pEnv, jobject aObject) +{ + LibreOfficeKitDocument* pDocument = getHandle<LibreOfficeKitDocument>(pEnv, aObject); + + gCallbackData.aObject = (jobject) pEnv->NewGlobalRef(aObject); + jclass aClass = pEnv->GetObjectClass(aObject); + gCallbackData.aClass = (jclass) pEnv->NewGlobalRef(aClass); + + gCallbackData.aJavaCallbackMethod = pEnv->GetMethodID(aClass, "messageRetrieved", "(ILjava/lang/String;)V"); + + pDocument->pClass->registerCallback(pDocument, messageCallback, (void*) &gCallbackData); +} + extern "C" SAL_JNI_EXPORT void JNICALL Java_org_libreoffice_kit_Document_destroy (JNIEnv* pEnv, jobject aObject) { commit 66f0c3a135977e487ab62a1148ab56cdf8c72331 Author: Tomaž Vajngerl <[email protected]> Date: Wed Jan 7 19:05:05 2015 +0900 android: No reason to return JNI version less than Java 6 Change-Id: Id9fae6561268bb7e5a465c19bdb80124f94f4939 diff --git a/sal/android/lo-bootstrap.c b/sal/android/lo-bootstrap.c index 2d2f01a..4d318e8 100644 --- a/sal/android/lo-bootstrap.c +++ b/sal/android/lo-bootstrap.c @@ -247,7 +247,7 @@ JNI_OnLoad(JavaVM* vm, void* reserved) the_java_vm = vm; - return JNI_VERSION_1_2; + return JNI_VERSION_1_6; } // public static native boolean setup(String dataDir, commit 1e5cdbef8d62c5b15d5bbfb9f019c86668b72143 Author: Tomaž Vajngerl <[email protected]> Date: Wed Jan 7 19:02:16 2015 +0900 lok: Add comments to some methods, put the star where it belongs Change-Id: I751eb175f29489637f465c9d97ebe920372f38bf diff --git a/include/LibreOfficeKit/LibreOfficeKit.h b/include/LibreOfficeKit/LibreOfficeKit.h index a4addb8..573e44d 100644 --- a/include/LibreOfficeKit/LibreOfficeKit.h +++ b/include/LibreOfficeKit/LibreOfficeKit.h @@ -76,9 +76,9 @@ struct _LibreOfficeKitClass { size_t nSize; - void (*destroy) (LibreOfficeKit *pThis); - LibreOfficeKitDocument* (*documentLoad) (LibreOfficeKit *pThis, const char *pURL); - char* (*getError) (LibreOfficeKit *pThis); + void (*destroy) (LibreOfficeKit* pThis); + LibreOfficeKitDocument* (*documentLoad) (LibreOfficeKit* pThis, const char* pURL); + char* (*getError) (LibreOfficeKit* pThis); }; #define LIBREOFFICEKIT_DOCUMENT_HAS(pDoc,member) LIBREOFFICEKIT_HAS_MEMBER(LibreOfficeKitDocumentClass,member,(pDoc)->pClass->nSize) @@ -94,16 +94,20 @@ struct _LibreOfficeKitDocumentClass void (*destroy) (LibreOfficeKitDocument* pThis); int (*saveAs) (LibreOfficeKitDocument* pThis, - const char *pUrl, - const char *pFormat, - const char *pFilterOptions); + const char* pUrl, + const char* pFormat, + const char* pFilterOptions); #ifdef LOK_USE_UNSTABLE_API LibreOfficeKitDocumentType (*getDocumentType) (LibreOfficeKitDocument* pThis); - // Part refers to either indivual sheets in a Spreadsheet, or slides - // in a Slideshow, and has no relevance for writer documents. + /** Get number of part that the document contains. + * Part refers to either indivual sheets in a Spreadsheet, + * or slides in a Slideshow, and has no relevance for + * writer documents. + */ int (*getParts) (LibreOfficeKitDocument* pThis); + /** Get current part of the document */ int (*getPart) (LibreOfficeKitDocument* pThis); void (*setPart) (LibreOfficeKitDocument* pThis, int nPart); @@ -124,12 +128,16 @@ struct _LibreOfficeKitDocumentClass const int nTileWidth, const int nTileHeight); - // Get the document sizes in twips. + /** Get the document sizes in twips. */ void (*getDocumentSize) (LibreOfficeKitDocument* pThis, long* pWidth, long* pHeight); - // Initialize document for rendering. + /** Initialize document for rendering. + * Sets the rendering and document parameters to default values + * that are needed to render the document correctly using + * tiled rendering. + */ void (*initializeForRendering) (LibreOfficeKitDocument* pThis); void (*registerCallback) (LibreOfficeKitDocument* pThis,
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
