首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JNI调用以从NoCLassDefFoundError的本机结果中查找Java类

JNI调用以从NoCLassDefFoundError的本机结果中查找Java类
EN

Stack Overflow用户
提问于 2015-09-11 12:51:47
回答 1查看 517关注 0票数 1

我正在使用以下代码从本机代码访问java类

代码语言:javascript
运行
复制
JNIEnv *env = nullptr;

JMVEnv::attachCurrentJNIENv(&env);

jclass jXYZClass = env->FindClass("com/xxx/xx/xx/XYZClassName");

这个调用通过了4-5次,但之后失败了。在某些调用后,jXYZClass为空。

因此,在编译类被发现的同时,在执行过程中也被发现了4-5次。我从不同的位置调用这段代码。会不会是线程问题?

EN

回答 1

Stack Overflow用户

发布于 2015-09-11 13:21:18

我认为这是一个多线程问题...特别是当你说“它被发现了4-5次。我从不同的地方调用这个代码”时。

有关更多详细信息,请参阅此post

首先,你可以打印每个线程的线程id,看看它们是否是同一个线程。

您可以在JNI_OnLoad中查找类:

代码语言:javascript
运行
复制
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);
}

无论何时您想要使用这个类:

代码语言:javascript
运行
复制
// 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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32515695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档