99#include " dn_method_call.h"
1010#include " dn_signature_helper.h"
1111#include " dn_callback.h"
12+ #include " jni_object_ref.h"
1213
1314extern " C"
1415{
1516
1617 static JavaVM *gJvm = nullptr ;
17- static jobject gClassLoader ;
18+ static JavaGlobalRef< jobject> * gClassLoader = nullptr ;
1819 static jmethodID gFindClassMethod ;
1920 static pthread_key_t detachKey = 0 ;
2021
2122 // / for invoke result compare
22- static jclass gStrCls ;
23+ static JavaGlobalRef< jclass> * gStrCls = nullptr ;
2324
24- // / key is jobject, value is pai which contain jclass and reference count
25+ // / key is jobject, value is pair which contain jclass and reference count
2526 static std::map<jobject, std::pair<jclass, int > > objectGlobalReference;
2627
2728 // / protect objectGlobalReference
@@ -92,13 +93,13 @@ extern "C"
9293 auto getClassLoaderMethod = env->GetMethodID (pluginClass, " getClassLoader" ,
9394 " ()Ljava/lang/ClassLoader;" );
9495 auto classLoader = env->CallObjectMethod (plugin, getClassLoaderMethod);
95- gClassLoader = env->NewGlobalRef (classLoader);
96+ gClassLoader = new JavaGlobalRef<jobject>( env->NewGlobalRef (classLoader), env );
9697 gFindClassMethod = env->GetMethodID (classLoaderClass, " findClass" ,
9798 " (Ljava/lang/String;)Ljava/lang/Class;" );
9899
99100 // / cache string class
100101 jclass strCls = env->FindClass (" java/lang/String" );
101- gStrCls = static_cast <jclass>(env->NewGlobalRef (strCls));
102+ gStrCls = new JavaGlobalRef<jclass>( static_cast <jclass>(env->NewGlobalRef (strCls)), env );
102103
103104 env->DeleteLocalRef (classLoader);
104105 env->DeleteLocalRef (plugin);
@@ -119,7 +120,7 @@ extern "C"
119120 {
120121 env->ExceptionClear ();
121122 DNDebug (" findClass exception" );
122- return static_cast <jclass>(env->CallObjectMethod (gClassLoader ,
123+ return static_cast <jclass>(env->CallObjectMethod (gClassLoader -> Object () ,
123124 gFindClassMethod ,
124125 env->NewStringUTF (name)));
125126 }
@@ -227,7 +228,7 @@ extern "C"
227228 jobject obj = env->CallObjectMethodA (object, method, argValues);
228229 if (obj != nullptr )
229230 {
230- if (env->IsInstanceOf (obj, gStrCls ))
231+ if (env->IsInstanceOf (obj, gStrCls -> Object () ))
231232 {
232233 // / mark the last pointer as string
233234 // / dart will check this pointer
@@ -380,7 +381,8 @@ extern "C"
380381 return nullptr ;
381382 }
382383
383- char *funName = (char *)env->GetStringUTFChars (functionName, 0 );
384+ char *funName = functionName == nullptr ? nullptr
385+ : (char *)env->GetStringUTFChars (functionName, 0 );
384386 char **dataTypes = new char *[argumentCount + 1 ];
385387 void **arguments = new void *[argumentCount + 1 ];
386388
@@ -456,8 +458,14 @@ extern "C"
456458 sem_destroy (&sem);
457459 }
458460
459- env->ReleaseStringUTFChars (returnTypeStr, returnType);
460- env->ReleaseStringUTFChars (functionName, funName);
461+ if (returnTypeStr != nullptr )
462+ {
463+ env->ReleaseStringUTFChars (returnTypeStr, returnType);
464+ }
465+ if (functionName != nullptr )
466+ {
467+ env->ReleaseStringUTFChars (functionName, funName);
468+ }
461469 delete[] arguments;
462470 delete[] dataTypes;
463471
0 commit comments