我要调用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
发布于 2013-11-12 17:31:18
问题不在于NewGlobalRef
,而在于FindClass
。
最好在JNI_OnLoad
中执行所有的FindClass
调用。这是因为类加载器的一些问题...当您在新线程上时,将使用不同的类加载器,这就是找不到该类的原因。
实际上,您可以将my_class
设置为全局的,在JNI_OnLoad
中创建GlobalRef
并在程序中的任何位置使用它,而不会出现问题。
https://stackoverflow.com/questions/10292507
复制相似问题