JNI 和 pthread

问题描述 投票:0回答:1

我打电话给

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
,它会返回一个有效的对象。 怎么了?

android-ndk
1个回答
1
投票

问题不在于

NewGlobalRef
,而在于
FindClass

最好在

FindClass
中拨打所有
JNI_OnLoad
电话。这是因为类加载器存在一些问题......当您在新线程上时,会使用不同的类加载器,这就是找不到该类的原因。

您实际上可以将

my_class
设为全局变量,在
GlobalRef
中创建
JNI_OnLoad
并在程序中的任何位置使用它,没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.