From 1cb45027a0aff21a51d95bdf5c5043b3aa5b3e19 Mon Sep 17 00:00:00 2001 From: "edburns%acm.org" Date: Thu, 16 Mar 2000 23:07:03 +0000 Subject: [PATCH] bug=32011 r=ashuk a=edburns This set of changes replaces all occurrences of env->Func(args...) with ::util_Func(env, args...) Except of course, for the implementations of the above mentioned ::util_Func() functions. This is done to allow the JNI functions to be called from a non JNI context, such as UNO. --- java/webclient/src_moz/BookmarksImpl.cpp | 4 +- java/webclient/src_moz/CurrentPageImpl.cpp | 2 +- .../src_moz/DocumentLoaderObserverImpl.cpp | 27 +- java/webclient/src_moz/HistoryImpl.cpp | 2 +- java/webclient/src_moz/Makefile.win | 5 +- java/webclient/src_moz/NativeEventThread.cpp | 16 +- java/webclient/src_moz/NavigationImpl.cpp | 16 +- java/webclient/src_moz/RDFEnumeration.cpp | 50 +--- java/webclient/src_moz/RDFTreeNode.cpp | 4 +- java/webclient/src_moz/WindowControlImpl.cpp | 47 +--- java/webclient/src_moz/WrapperFactoryImpl.cpp | 13 +- java/webclient/src_moz/jni_util.cpp | 234 ++++++++++++++++++ java/webclient/src_moz/jni_util.h | 50 +++- 13 files changed, 337 insertions(+), 133 deletions(-) diff --git a/java/webclient/src_moz/BookmarksImpl.cpp b/java/webclient/src_moz/BookmarksImpl.cpp index 110889149d8..5fd9810fc77 100644 --- a/java/webclient/src_moz/BookmarksImpl.cpp +++ b/java/webclient/src_moz/BookmarksImpl.cpp @@ -61,13 +61,13 @@ Java_org_mozilla_webclient_wrapper_1native_BookmarksImpl_nativeNewRDFNode jint result = -1; nsAutoString uri("NC:BookmarksRoot"); - const char *url = env->GetStringUTFChars(urlString, nsnull); + const char *url = ::util_GetStringUTFChars(env, urlString); uri.Append("#$"); uri.Append(url); printf("debug: edburns: nativeNewRDFNode: url: %s\n", url); rv = gRDF->GetUnicodeResource(uri.GetUnicode(), getter_AddRefs(newNode)); - env->ReleaseStringUTFChars(urlString, url); + ::util_ReleaseStringUTFChars(env, urlString, url); if (NS_FAILED(rv)) { ::util_ThrowExceptionToJava(env, "Exception: nativeNewRDFNode: can't create new nsIRDFResource."); return result; diff --git a/java/webclient/src_moz/CurrentPageImpl.cpp b/java/webclient/src_moz/CurrentPageImpl.cpp index 2fdfdec030a..53f412099ba 100644 --- a/java/webclient/src_moz/CurrentPageImpl.cpp +++ b/java/webclient/src_moz/CurrentPageImpl.cpp @@ -133,7 +133,7 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_webclient_wrapper_1native_CurrentPage charResult = (char *) ::util_PostSynchronousEvent(initContext, event); if (charResult != nsnull) { - urlString = env->NewStringUTF((const char *) charResult); + urlString = ::util_NewStringUTF(env, (const char *) charResult); } else { ::util_ThrowExceptionToJava(env, "raptorWebShellGetURL Exception: GetURL() returned NULL"); diff --git a/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp b/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp index bf4ffc1f3b1..b4e6e434f9c 100644 --- a/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp +++ b/java/webclient/src_moz/DocumentLoaderObserverImpl.cpp @@ -78,24 +78,9 @@ DocumentLoaderObserverImpl::DocumentLoaderObserverImpl(JNIEnv *env, mJNIEnv(env), mInitContext(yourInitContext), mTarget(yourTarget) { if (nsnull == gVm) { // declared in jni_util.h - env->GetJavaVM(&gVm); // save this vm reference away for the callback! + ::util_GetJavaVM(env, &gVm); // save this vm reference away for the callback! } -#ifdef XP_PC - // debug: edburns: - DWORD nativeThreadID = GetCurrentThreadId(); - printf("debug: edburns: DocumentLoaderObserverImpl ctor nativeThreadID: %d\n", - nativeThreadID); -#endif - - char *currentThreadName = nsnull; - - if (nsnull != (currentThreadName = util_GetCurrentThreadName(env))) { - printf("debug: edburns: DocumentLoaderObserverImpl ctor threadName: %s\n", - currentThreadName); - delete currentThreadName; - } - if (-1 == maskValues[0]) { InitializeMaskValues(); } @@ -115,7 +100,8 @@ void DocumentLoaderObserverImpl::InitializeMaskValues() return; } - jclass documentLoadEventClass = env->FindClass("org/mozilla/webclient/DocumentLoadEvent"); + jclass documentLoadEventClass = ::util_FindClass(env, + "org/mozilla/webclient/DocumentLoadEvent"); if (nsnull == documentLoadEventClass) { return; @@ -125,14 +111,15 @@ void DocumentLoaderObserverImpl::InitializeMaskValues() jfieldID fieldID; while (nsnull != maskNames[i]) { - fieldID = env->GetStaticFieldID(documentLoadEventClass, maskNames[i], - "J"); + fieldID = ::util_GetStaticFieldID(env, documentLoadEventClass, + maskNames[i], "J"); if (nsnull == fieldID) { return; } - maskValues[i] = env->GetStaticLongField(documentLoadEventClass, fieldID); + maskValues[i] = ::util_GetStaticLongField(env, documentLoadEventClass, + fieldID); i++; } } diff --git a/java/webclient/src_moz/HistoryImpl.cpp b/java/webclient/src_moz/HistoryImpl.cpp index da314aaac3f..e8f26f1e81d 100644 --- a/java/webclient/src_moz/HistoryImpl.cpp +++ b/java/webclient/src_moz/HistoryImpl.cpp @@ -304,7 +304,7 @@ JNIEXPORT jstring JNICALL Java_org_mozilla_webclient_wrapper_1native_HistoryImpl charResult = (char *) ::util_PostSynchronousEvent(initContext, event); if (charResult != nsnull) { - urlString = env->NewStringUTF((const char *) charResult); + urlString = ::util_NewStringUTF(env, (const char *) charResult); } else { ::util_ThrowExceptionToJava(env, "raptorWebShellGetURL Exception: GetURL() returned nsnull"); diff --git a/java/webclient/src_moz/Makefile.win b/java/webclient/src_moz/Makefile.win index 3dbc2f911cf..f4fd3676a12 100644 --- a/java/webclient/src_moz/Makefile.win +++ b/java/webclient/src_moz/Makefile.win @@ -47,12 +47,12 @@ OBJS = \ .\$(OBJDIR)\nsSetupRegistry.obj \ $(NULL) -LINCS = \ +INCS = \ -I$(JDKHOME)\include \ -I$(JDKHOME)\include\win32 \ + $(INCS) \ $(NULL) - LCFLAGS = \ -DDEBUG_RAPTOR_CANVAS \ $(NULL) @@ -134,6 +134,7 @@ buildRunems: install:: $(DLL) buildRunems $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).dll $(DIST)\bin + $(MAKE_INSTALL) .\$(OBJDIR)\$(DLLNAME).lib $(DIST)\lib clobber_all:: clobber diff --git a/java/webclient/src_moz/NativeEventThread.cpp b/java/webclient/src_moz/NativeEventThread.cpp index 4e466c9c72a..9ccd4ef24bb 100644 --- a/java/webclient/src_moz/NativeEventThread.cpp +++ b/java/webclient/src_moz/NativeEventThread.cpp @@ -108,6 +108,9 @@ char * errorMessages[] = { * PENDING(): this should probably live in EventRegistration.h + * PENDING(edburns): need to abstract this out so we can use it from uno + * and JNI. + */ const char *gSupportedListenerInterfaces[] = { @@ -140,7 +143,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NativeEventThr return; } if (nsnull == gVm) { // declared in jni_util.h - env->GetJavaVM(&gVm); // save this vm reference + ::util_GetJavaVM(env, &gVm); // save this vm reference } rv = InitMozillaStuff(initContext); @@ -155,7 +158,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NativeEventThr ::PR_Sleep(PR_INTERVAL_NO_WAIT); if (initContext->initFailCode != 0) { - ::util_ThrowExceptionToJava(initContext->env, errorMessages[initContext->initFailCode]); + ::util_ThrowExceptionToJava(env, errorMessages[initContext->initFailCode]); return; } } @@ -217,10 +220,11 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NativeEventThr while (nsnull != gSupportedListenerInterfaces[listenerType]) { if (nsnull == (clazz = - env->FindClass(gSupportedListenerInterfaces[listenerType]))) { + ::util_FindClass(env, + gSupportedListenerInterfaces[listenerType]))) { return; } - if (env->IsInstanceOf(typedListener, clazz)) { + if (::util_IsInstanceOf(env, typedListener, clazz)) { // We've got a winner! break; } @@ -235,7 +239,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NativeEventThr jobject globalRef = nsnull; // PENDING(edburns): make sure do DeleteGlobalRef on the removeListener - if (nsnull == (globalRef = env->NewGlobalRef(typedListener))) { + if (nsnull == (globalRef = ::util_NewGlobalRef(env, typedListener))) { ::util_ThrowExceptionToJava(env, "Exception: NativeEventThread.nativeAddListener(): can't create NewGlobalRef\n\tfor argument"); return; } @@ -466,8 +470,6 @@ nsresult InitMozillaStuff (WebShellInitContext * initContext) if (NS_FAILED(rv)) { initContext->initFailCode = kHistoryWebShellError; - ::util_ThrowExceptionToJava(initContext->env, - "Exception: Can't get DocShell from nsIWebShell"); return rv; } diff --git a/java/webclient/src_moz/NavigationImpl.cpp b/java/webclient/src_moz/NavigationImpl.cpp index 31631a15556..a82429d60c5 100644 --- a/java/webclient/src_moz/NavigationImpl.cpp +++ b/java/webclient/src_moz/NavigationImpl.cpp @@ -35,17 +35,19 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NavigationImpl (JNIEnv *env, jobject obj, jint webShellPtr, jstring urlString) { jobject jobj = obj; - const char * urlChars = (char *) env->GetStringUTFChars(urlString, 0); + const char * urlChars = (char *) ::util_GetStringUTFChars(env, + urlString); printf("Native URL = \"%s\"\n", urlChars); - env->ReleaseStringUTFChars(urlString, urlChars); + ::util_ReleaseStringUTFChars(env, urlString, urlChars); - PRUnichar * urlStringChars = (PRUnichar *) env->GetStringChars(urlString, 0); + PRUnichar * urlStringChars = (PRUnichar *) ::util_GetStringChars(env, + urlString); - if (env->ExceptionOccurred()) { + if (::util_ExceptionOccurred(env)) { ::util_ThrowExceptionToJava(env, "raptorWebShellLoadURL Exception: unable to extract Java string"); if (urlStringChars != nsnull) - env->ReleaseStringChars(urlString, urlStringChars); + ::util_ReleaseStringChars(env, urlString, urlStringChars); return; } @@ -54,7 +56,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NavigationImpl if (initContext == nsnull) { ::util_ThrowExceptionToJava(env, "Exception: null webShellPtr passed to raptorWebShellLoadURL"); if (urlStringChars != nsnull) - env->ReleaseStringChars(urlString, urlStringChars); + ::util_ReleaseStringChars(env, urlString, urlStringChars); return; } @@ -65,7 +67,7 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NavigationImpl ::util_PostEvent(initContext, event); } - env->ReleaseStringChars(urlString, urlStringChars); + ::util_ReleaseStringChars(env, urlString, urlStringChars); } JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_NavigationImpl_nativeRefresh diff --git a/java/webclient/src_moz/RDFEnumeration.cpp b/java/webclient/src_moz/RDFEnumeration.cpp index 976d3d89dcf..b46c5c3a736 100644 --- a/java/webclient/src_moz/RDFEnumeration.cpp +++ b/java/webclient/src_moz/RDFEnumeration.cpp @@ -121,37 +121,24 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_RDFEnumeration_nativeFinalize (JNIEnv *env, jobject obj) { - jclass objClass; - jfieldID nativeEnumFieldID; - jfieldID nativeContainerFieldID; jint nativeEnum, nativeContainer; - - objClass = env->GetObjectClass(obj); - if (nsnull == objClass) { - printf("nativeFinalize: Can't get object class for RDFEnumeration.\n"); - return; - } // release the nsISimpleEnumerator - nativeEnumFieldID = env->GetFieldID(objClass, "nativeEnum", "I"); - if (nsnull == nativeEnumFieldID) { + if (-1 == (nativeEnum = + ::util_GetIntValueFromInstance(env, obj, "nativeEnum"))) { printf("nativeFinalize: Can't get fieldID for nativeEnum.\n"); return; } - - nativeEnum = env->GetIntField(obj, nativeEnumFieldID); nsCOMPtr enumerator = (nsISimpleEnumerator *) nativeEnum; ((nsISupports *)enumerator.get())->Release(); // release the nsIRDFContainer - nativeContainerFieldID = env->GetFieldID(objClass, "nativeContainer", "I"); - if (nsnull == nativeContainerFieldID) { - printf("nativeFinalize: Can't get fieldID for nativeContainer.\n"); + if (-1 == (nativeContainer = + ::util_GetIntValueFromInstance(env, obj, "nativeContainer"))) { + printf("nativeFinalize: Can't get fieldID for nativeContainerFieldID.\n"); return; } - - nativeContainer = env->GetIntField(obj, nativeContainerFieldID); nsCOMPtr container = (nsIRDFContainer *) nativeContainer; ((nsISupports *)container.get())->Release(); @@ -169,23 +156,8 @@ jint getNativeEnumFromJava(JNIEnv *env, jobject obj, jint nativeRDFNode) { nsresult rv; jint result = -1; - jclass objClass; - jfieldID nativeEnumFieldID; - jfieldID nativeContainerFieldID; - objClass = env->GetObjectClass(obj); - if (nsnull == objClass) { - printf("getNativeEnumFromJava: Can't get object class for RDFEnumeration.\n"); - return -1; - } - - nativeEnumFieldID = env->GetFieldID(objClass, "nativeEnum", "I"); - if (nsnull == nativeEnumFieldID) { - printf("getNativeEnumFromJava: Can't get fieldID for nativeEnum.\n"); - return -1; - } - - result = env->GetIntField(obj, nativeEnumFieldID); + result = ::util_GetIntValueFromInstance(env, obj, "nativeEnum"); // if the field has been initialized, just return the value if (-1 != result) { @@ -229,7 +201,7 @@ jint getNativeEnumFromJava(JNIEnv *env, jobject obj, jint nativeRDFNode) } // IMPORTANT: Store the enum back into java - env->SetIntField(obj, nativeEnumFieldID, (jint) enumerator.get()); + ::util_SetIntValueForInstance(env,obj,"nativeEnum",(jint)enumerator.get()); // IMPORTANT: make sure it doesn't get deleted when it goes out of scope ((nsISupports *)enumerator.get())->AddRef(); @@ -237,12 +209,8 @@ jint getNativeEnumFromJava(JNIEnv *env, jobject obj, jint nativeRDFNode) // nsIRDFContainer from being destructed in order to maintain the // validity of the nsISimpleEnumerator that came from the container. // Just to be safe, I'm doing so. - nativeContainerFieldID = env->GetFieldID(objClass, "nativeContainer", "I"); - if (nsnull == nativeContainerFieldID) { - printf("getNativeEnumFromJava: Can't get fieldID for nativeContainer.\n"); - return -1; - } - env->SetIntField(obj, nativeContainerFieldID, (jint) container.get()); + ::util_SetIntValueForInstance(env, obj, "nativeContainer", + (jint) container.get()); ((nsISupports *)container.get())->AddRef(); // NORMAL EXIT 2 diff --git a/java/webclient/src_moz/RDFTreeNode.cpp b/java/webclient/src_moz/RDFTreeNode.cpp index 2e273e69623..55856eb38fd 100644 --- a/java/webclient/src_moz/RDFTreeNode.cpp +++ b/java/webclient/src_moz/RDFTreeNode.cpp @@ -218,10 +218,10 @@ Java_org_mozilla_webclient_wrapper_1native_RDFTreeNode_nativeToString length = string->Length(); } - result = env->NewString(textForNode, length); + result = ::util_NewString(env, textForNode, length); } else { - result = env->NewStringUTF(""); + result = ::util_NewStringUTF(env, ""); } return result; } diff --git a/java/webclient/src_moz/WindowControlImpl.cpp b/java/webclient/src_moz/WindowControlImpl.cpp index f4d5ae2ea80..2426421a722 100644 --- a/java/webclient/src_moz/WindowControlImpl.cpp +++ b/java/webclient/src_moz/WindowControlImpl.cpp @@ -62,7 +62,6 @@ JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI (JNIEnv *env, jobject obj, jint windowPtr, jint x, jint y, jint width, jint height, jobject aBrowserControlImpl) { - jobject jobj = obj; #ifdef XP_MAC WindowPtr pWindow = (WindowPtr) windowPtr; Rect webRect = pWindow->portRect; @@ -87,8 +86,8 @@ JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI initContext->embeddedThread = nsnull; initContext->sessionHistory = nsnull; initContext->actionQueue = nsnull; - initContext->nativeEventThread = nsnull; initContext->env = env; + initContext->nativeEventThread = nsnull; initContext->stopThread = FALSE; initContext->x = x; initContext->y = y; @@ -96,36 +95,8 @@ JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI initContext->h = height; #ifdef XP_UNIX - jclass cls = env->GetObjectClass(aBrowserControlImpl); // Get Class for BrowserControlImpl object - jclass clz = env->FindClass("org/mozilla/webclient/BrowserControlImpl"); - if (nsnull == clz) { - ::util_ThrowExceptionToJava(env, "Exception: Could not find class for BrowserControlImpl"); - return (jint) 0; - } - jboolean ans = env->IsInstanceOf(aBrowserControlImpl, clz); - if (JNI_FALSE == ans) { - ::util_ThrowExceptionToJava(env, "Exception: We have a problem"); - return (jint) 0; - } - // Get myCanvas IVar - jfieldID fid = env->GetFieldID(cls, "myCanvas", "Lorg/mozilla/webclient/BrowserControlCanvas;"); - if (nsnull == fid) { - ::util_ThrowExceptionToJava(env, "Exception: field myCanvas not found in the jobject for BrowserControlImpl"); - return (jint) 0; - } - jobject canvasObj = env->GetObjectField(aBrowserControlImpl, fid); - jclass canvasCls = env->GetObjectClass(canvasObj); - if (nsnull == canvasCls) { - ::util_ThrowExceptionToJava(env, "Exception: Could Not find Class for CanvasObj"); - return (jint) 0; - } - jfieldID gtkfid = env->GetFieldID(canvasCls, "gtkWinPtr", "I"); - if (nsnull == gtkfid) { - ::util_ThrowExceptionToJava(env, "Exception: field gtkWinPtr not found in the jobject for BrowserControlCanvas"); - return (jint) 0; - } - jint mozPtr = env->GetIntField(canvasObj, gtkfid); - initContext->gtkWinPtr = (int) mozPtr; + initContext->gtkWinPtr = + (int)::util_GetGTKWinPtrFromCanvas(env, aBrowserControlImpl); #else initContext->gtkWinPtr = nsnull; #endif @@ -174,9 +145,6 @@ Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeDestroyInitCo JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeMoveWindowTo (JNIEnv *env, jobject obj, jint webShellPtr, jint x, jint y) { - JNIEnv * pEnv = env; - jobject jobj = obj; - WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr; if (initContext == nsnull) { @@ -195,9 +163,6 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeRemoveFocus (JNIEnv *env, jobject obj, jint webShellPtr) { - JNIEnv * pEnv = env; - jobject jobj = obj; - WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr; if (initContext == nsnull) { @@ -216,9 +181,6 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeRepaint (JNIEnv *env, jobject obj, jint webShellPtr, jboolean forceRepaint) { - JNIEnv * pEnv = env; - jobject jobj = obj; - WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr; if (initContext == nsnull) { @@ -261,9 +223,6 @@ JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlI JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_WindowControlImpl_nativeSetFocus (JNIEnv *env, jobject obj, jint webShellPtr) { - JNIEnv * pEnv = env; - jobject jobj = obj; - WebShellInitContext* initContext = (WebShellInitContext *) webShellPtr; if (initContext == nsnull) { diff --git a/java/webclient/src_moz/WrapperFactoryImpl.cpp b/java/webclient/src_moz/WrapperFactoryImpl.cpp index 24bc046ed97..ebab2cf9253 100644 --- a/java/webclient/src_moz/WrapperFactoryImpl.cpp +++ b/java/webclient/src_moz/WrapperFactoryImpl.cpp @@ -27,6 +27,8 @@ #include "WrapperFactoryImpl.h" +#include "jni_util.h" + #include "nsIServiceManager.h" // for NS_InitXPCOM #include "nsAppShellCIDs.h" // for NS_SESSIONHISTORY_CID #include "nsCRT.h" // for nsCRT::strcmp @@ -83,7 +85,8 @@ Java_org_mozilla_webclient_wrapper_1native_WrapperFactoryImpl_nativeAppInitializ jobject jobj = obj; static PRBool gFirstTime = PR_TRUE; if (gFirstTime) { - const char *nativePath = (const char *) env->GetStringUTFChars(verifiedBinDirAbsolutePath, 0); + const char *nativePath = (const char *) ::util_GetStringUTFChars(env, + verifiedBinDirAbsolutePath); gBinDir = nativePath; NS_InitXPCOM(nsnull, &gBinDir); @@ -93,7 +96,7 @@ Java_org_mozilla_webclient_wrapper_1native_WrapperFactoryImpl_nativeAppInitializ PR_FALSE, PR_FALSE); NS_AutoregisterComponents(); gFirstTime = PR_FALSE; - env->ReleaseStringUTFChars(verifiedBinDirAbsolutePath, nativePath); + ::util_ReleaseStringUTFChars(env, verifiedBinDirAbsolutePath, nativePath); } } @@ -109,8 +112,8 @@ JNIEXPORT jboolean JNICALL Java_org_mozilla_webclient_wrapper_1native_WrapperFactoryImpl_nativeDoesImplement (JNIEnv *env, jobject obj, jstring interfaceName) { - const char *iName = (const char *) env->GetStringUTFChars(interfaceName, - 0); + const char *iName = (const char *) ::util_GetStringUTFChars(env, + interfaceName); jboolean result = JNI_FALSE; int i = 0; @@ -125,7 +128,7 @@ Java_org_mozilla_webclient_wrapper_1native_WrapperFactoryImpl_nativeDoesImplemen break; } } - env->ReleaseStringUTFChars(interfaceName, iName); + ::util_ReleaseStringUTFChars(env, interfaceName, iName); return result; } diff --git a/java/webclient/src_moz/jni_util.cpp b/java/webclient/src_moz/jni_util.cpp index abf409c5094..8db2eae9799 100644 --- a/java/webclient/src_moz/jni_util.cpp +++ b/java/webclient/src_moz/jni_util.cpp @@ -165,6 +165,240 @@ void util_DumpJavaStack(JNIEnv *env) } } +const char * util_GetStringUTFChars(JNIEnv *env, jstring inString) +{ + const char *result = nsnull; + +#ifdef BAL_INTERFACE +#else + result = (const char *) env->GetStringUTFChars(inString, 0); +#endif + + return result; +} + +void util_ReleaseStringUTFChars(JNIEnv *env, jstring inString, + const char *stringFromGet) +{ + +#ifdef BAL_INTERFACE +#else + env->ReleaseStringUTFChars(inString, stringFromGet); +#endif + +} + +const jchar * util_GetStringChars(JNIEnv *env, jstring inString) +{ + const jchar *result = nsnull; + +#ifdef BAL_INTERFACE +#else + result = (const jchar *) env->GetStringChars(inString, 0); +#endif + + return result; +} + +void util_ReleaseStringChars(JNIEnv *env, jstring inString, + const jchar *stringFromGet) +{ + +#ifdef BAL_INTERFACE +#else + env->ReleaseStringChars(inString, stringFromGet); +#endif + +} + +jstring util_NewStringUTF(JNIEnv *env, const char *inString) +{ + jstring result; +#ifdef BAL_INTERFACE +#else + result = env->NewStringUTF(inString); +#endif + + return result; +} + +jstring util_NewString(JNIEnv *env, const jchar *inString, jsize len) +{ + jstring result; +#ifdef BAL_INTERFACE +#else + result = env->NewString(inString, len); +#endif + + return result; +} + +jobject util_NewGlobalRef(JNIEnv *env, jobject obj) +{ + jobject result = nsnull; +#ifdef BAL_INTERFACE +#else + result = env->NewGlobalRef(obj); +#endif + return result; +} + +void util_DeleteGlobalRef(JNIEnv *env, jobject obj) +{ +#ifdef BAL_INTERFACE +#else + env->DeleteGlobalRef(obj); +#endif +} + +jthrowable util_ExceptionOccurred(JNIEnv *env) +{ + jthrowable result = nsnull; +#ifdef BAL_INTERFACE +#else + result = env->ExceptionOccurred(); +#endif + return result; +} + +jint util_GetJavaVM(JNIEnv *env, JavaVM **vm) +{ + int result = -1; +#ifdef BAL_INTERFACE +#else + result = env->GetJavaVM(vm); +#endif + return result; +} + +jclass util_FindClass(JNIEnv *env, const char *fullyQualifiedClassName) +{ + jclass result = nsnull; +#ifdef BAL_INTERFACE +#else + result = env->FindClass(fullyQualifiedClassName); +#endif + return result; +} + +jfieldID util_GetStaticFieldID(JNIEnv *env, jclass clazz, + const char *fieldName, + const char *signature) +{ + jfieldID result = nsnull; +#ifdef BAL_INTERFACE +#else + result = env->GetStaticFieldID(clazz, fieldName, signature); +#endif + return result; +} + +jlong util_GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID id) +{ + jlong result = -1; +#ifdef BAL_INTERFACE +#else + result = env->GetStaticLongField(clazz, id); +#endif + return result; +} + +jboolean util_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz) +{ + jboolean result = JNI_FALSE; +#ifdef BAL_INTERFACE +#else + result = env->IsInstanceOf(obj, clazz); +#endif + return result; +} + +#ifdef XP_UNIX +jint util_GetGTKWinPtrFromCanvas(JNIEnv *env, jobject browserControlCanvas) +{ + jint result = -1; +#ifdef BAL_INTERFACE +#else + jclass cls = env->GetObjectClass(browserControlCanvas); // Get Class for BrowserControlImpl object + jclass clz = env->FindClass("org/mozilla/webclient/BrowserControlImpl"); + if (nsnull == clz) { + ::util_ThrowExceptionToJava(env, "Exception: Could not find class for BrowserControlImpl"); + return (jint) 0; + } + jboolean ans = env->IsInstanceOf(browserControlCanvas, clz); + if (JNI_FALSE == ans) { + ::util_ThrowExceptionToJava(env, "Exception: We have a problem"); + return (jint) 0; + } + // Get myCanvas IVar + jfieldID fid = env->GetFieldID(cls, "myCanvas", "Lorg/mozilla/webclient/BrowserControlCanvas;"); + if (nsnull == fid) { + ::util_ThrowExceptionToJava(env, "Exception: field myCanvas not found in the jobject for BrowserControlImpl"); + return (jint) 0; + } + jobject canvasObj = env->GetObjectField(browserControlCanvas, fid); + jclass canvasCls = env->GetObjectClass(canvasObj); + if (nsnull == canvasCls) { + ::util_ThrowExceptionToJava(env, "Exception: Could Not find Class for CanvasObj"); + return (jint) 0; + } + jfieldID gtkfid = env->GetFieldID(canvasCls, "gtkWinPtr", "I"); + if (nsnull == gtkfid) { + ::util_ThrowExceptionToJava(env, "Exception: field gtkWinPtr not found in the jobject for BrowserControlCanvas"); + return (jint) 0; + } + result = env->GetIntField(canvasObj, gtkfid); +#endif + return result; +} +#endif + +jint util_GetIntValueFromInstance(JNIEnv *env, jobject obj, + const char *fieldName) +{ + int result = -1; +#ifdef BAL_INTERFACE +#else + jclass objClass = env->GetObjectClass(obj); + if (nsnull == objClass) { + printf("util_GetIntValueFromInstance: Can't get object class from instance.\n"); + return result; + } + + jfieldID theFieldID = env->GetFieldID(objClass, fieldName, "I"); + if (nsnull == theFieldID) { + printf("util_GetIntValueFromInstance: Can't get fieldID for fieldName.\n"); + return result; + } + + result = env->GetIntField(obj, theFieldID); +#endif + return result; +} + +void util_SetIntValueForInstance(JNIEnv *env, jobject obj, + const char *fieldName, jint newValue) +{ +#ifdef BAL_INTERFACE +#else + jclass objClass = env->GetObjectClass(obj); + if (nsnull == objClass) { + printf("util_SetIntValueForInstance: Can't get object class from instance.\n"); + return; + } + + jfieldID fieldID = env->GetFieldID(objClass, fieldName, "I"); + if (nsnull == fieldID) { + printf("util_SetIntValueForInstance: Can't get fieldID for fieldName.\n"); + return; + } + + env->SetIntField(obj, fieldID, newValue); +#endif; +} + + + JNIEXPORT jvalue JNICALL JNU_CallMethodByName(JNIEnv *env, jboolean *hasException, diff --git a/java/webclient/src_moz/jni_util.h b/java/webclient/src_moz/jni_util.h index 3c4932c03c7..3f5b49535a5 100644 --- a/java/webclient/src_moz/jni_util.h +++ b/java/webclient/src_moz/jni_util.h @@ -70,7 +70,7 @@ struct WebShellInitContext { nsISessionHistory* sessionHistory; PLEventQueue * actionQueue; PRThread * embeddedThread; - JNIEnv * env; + JNIEnv * env; jobject nativeEventThread; int stopThread; int initComplete; @@ -144,6 +144,49 @@ char *util_GetCurrentThreadName(JNIEnv *env); void util_DumpJavaStack(JNIEnv *env); +// +// Functions to wrap JNIEnv functions. +// + +const char *util_GetStringUTFChars(JNIEnv *env, jstring inString); + +void util_ReleaseStringUTFChars(JNIEnv *env, jstring inString, + const char *stringFromGet); + +const jchar *util_GetStringChars(JNIEnv *env, jstring inString); + +void util_ReleaseStringChars(JNIEnv *env, jstring inString, + const jchar *stringFromGet); + +jstring util_NewStringUTF(JNIEnv *env, const char * inString); + +jstring util_NewString(JNIEnv *env, const jchar *inString, jsize len); + +jobject util_NewGlobalRef(JNIEnv *env, jobject toAddRef); + +void util_DeleteGlobalRef(JNIEnv *env, jobject toAddRef); + +jthrowable util_ExceptionOccurred(JNIEnv *env); + +jint util_GetJavaVM(JNIEnv *env, JavaVM **vm); + +jclass util_FindClass(JNIEnv *env, const char *fullyQualifiedClassName); + +jfieldID util_GetStaticFieldID(JNIEnv *env, jclass clazz, + const char *fieldName, + const char *signature); + +jlong util_GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID id); + +jboolean util_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz); + +jint util_GetIntValueFromInstance(JNIEnv *env, jobject instance, + const char *fieldName); + +void util_SetIntValueForInstance(JNIEnv *env, jobject instance, + const char *fieldName, jint newValue); + + // // Functions from secret JDK files // @@ -167,4 +210,9 @@ JNU_CallMethodByNameV(JNIEnv *env, JNIEXPORT void * JNICALL JNU_GetEnv(JavaVM *vm, jint version); +// hack functions to get around mozilla oddities +#ifdef XP_UNIX +jint util_GetGTKWinPtrFromCanvas(JNIEnv *env, jobject browserControlCanvas); +#endif + #endif // jni_util_h