Android ndk JNI和pthread

Android ndk JNI和pthread,android-ndk,Android Ndk,我正在调用JNI_OnLoad以在JavaVM*本地保存一个文件: JavaVM * and_jvm = NULL; jint JNI_OnLoad(JavaVM* vm, void* reserved) { and_jvm = vm; return JNI_VERSION_1_6; } 当我开始我的线程时,我调用

我正在调用JNI_OnLoad以在JavaVM*本地保存一个文件:

             JavaVM * and_jvm = NULL;
             jint JNI_OnLoad(JavaVM* vm, void* reserved)
             {
                   and_jvm = vm;
                   return JNI_VERSION_1_6;
             }
当我开始我的线程时,我调用

             void * thread_f (void * v)
             {
             jint attachResult = and_jvm->AttachCurrentThread(&env,NULL);
             //The attachResult is 0.
             jclass my_class= (jclass)env->NewGlobalRef(env->FindClass("my/package/com/MyClass"));
             //my_class is 0
             if (my_class == 0)
                  return NULL;
             }
如果我在线程外调用NewGlobalRef,它将返回一个有效的对象。 怎么了

10xs,
Nahum

问题不在于
NewGlobalRef
,而在于
FindClass

最好在
JNI_OnLoad
中执行所有
FindClass
调用。这是因为类加载器的一些问题。。。当您在新线程上时,会使用不同的类加载器,这就是为什么找不到该类的原因


实际上,您可以将
my_类
设为全局类,在
JNI_OnLoad
中创建
GlobalRef
,并在程序中的任何位置使用它,而不会出现问题。

问题不在于
NewGlobalRef
而是在于
FindClass

最好在
JNI_OnLoad
中执行所有
FindClass
调用。这是因为类加载器的一些问题。。。当您在新线程上时,会使用不同的类加载器,这就是为什么找不到该类的原因


实际上,您可以将
my_类
设置为全局类,在
JNI_OnLoad
中创建
GlobalRef
,并在程序中的任何位置使用它,而不会出现任何问题。

当NewGlobalRef返回一个有效对象时,您问的问题是什么?你以为它会回来吗?如果0是有效的结果,则表示包my.package.com中没有此类类-MyClass,但lib主线程对NewGlobalRef的相同调用返回一个有效的jclass,因此我猜包my.package.com中有MyClass,我不明白。你是说“如果我在线程外调用NewGlobalRef,它将返回一个有效的对象”-那么当你从线程调用NewGlobalRef时,你得到的是有效的对象,或者什么?你是在问当NewGlobalRef返回一个有效的对象时,有什么不对?你以为它会回来吗?如果0是有效的结果,则表示包my.package.com中没有此类类-MyClass,但lib主线程对NewGlobalRef的相同调用返回一个有效的jclass,因此我猜包my.package.com中有MyClass,我不明白。您的意思是“如果我从线程中调用NewGlobalRef,它将返回一个有效的对象”——所以当您从线程中调用NewGlobalRef时,您得到的是有效的对象,或者是什么?