我正在使用以下代码从本机代码访问java类
JNIEnv *env = nullptr;
JMVEnv::attachCurrentJNIENv(&env);
jclass jXYZClass = env->FindClass("com/xxx/xx/xx/XYZClassName");
这个调用通过了4-5次,但之后失败了。在某些调用后,jXYZClass为空。
因此,在编译类被发现的同时,在执行过程中也被发现了4-5次。我从不同的位置调用这段代码。会不会是线程问题?
发布于 2015-09-11 13:21:18
我认为这是一个多线程问题...特别是当你说“它被发现了4-5次。我从不同的地方调用这个代码”时。
有关更多详细信息,请参阅此post。
首先,你可以打印每个线程的线程id,看看它们是否是同一个线程。
您可以在JNI_OnLoad中查找类:
jobject g_class;
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *pjvm, void *reserved) {
JavaVM *gJvm = pjvm; // cache the JavaVM pointer
JNIEnv *env= NULL;
env = gJvm->GetEnv((void**)&env, JNI_VERSION_1_6);
jclass tmp = env->FindClass("com/xxx/xx/xx/XYZClassName");
g_class = env->NewGlobalRef(tmp);
}
无论何时您想要使用这个类:
// extern jobject g_class; Add this Line if this is in another cpp file
jmethodID methodID = env->GetMethodID((jclass)g_class, "<init>", "()V");
jobject new_object = env->NewObject((jclass)g_class, methodID);
https://stackoverflow.com/questions/32515695
复制相似问题