一个 jni 相关问题,希望解惑。

2021-07-04 23:04:12 +08:00
 userGyl
流程是在 cpp 中调用 jni.cpp 再调用 java,报错
JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib64, /system_ext/lib64, /system/lib64, /system_ext/lib64]]

下面贴一下调用代码
//通过 jvm 获取 env 的方式
JNIEnv *get_env(int *attach) {
if (javaVM == NULL) return NULL;
*attach = 0;
JNIEnv *jni_env = NULL;
int status = javaVM->GetEnv((void **) &jni_env, JNI_VERSION_1_6);
if (status == JNI_EDETACHED || jni_env == NULL) {
JavaVMAttachArgs vmAttachArgs;
vmAttachArgs.version = JNI_VERSION_1_6;
vmAttachArgs.name = NULL;
vmAttachArgs.group = NULL;

status = javaVM->AttachCurrentThread(&jni_env, &vmAttachArgs);
if (status < 0) {
jni_env = NULL;
} else {
*attach = 1;
}
}
return jni_env;
}
//对应 java 文件声明的 native 函数
extern "C"
JNIEXPORT void JNICALL
Java_com_hik_netsdk_SimpleDemo_XJni_Heart(JNIEnv *ev, jobject t) {

int attach = 0;
JNIEnv *env = get_env(&attach);

const char *javaPath="包名 /XJni";
jclass clazz = env->FindClass(javaPath); //debug 显示返回为 null
jmethodID mid = env->GetMethodID(clazz, "CallJavaHeart", "()V");
jobject jobject = env->AllocObject(clazz);
env->CallVoidMethod(jobject, mid);

if (attach == 1) {
del_env();
}


}


网上的一些解决方案试过了,但是无效,希望有大佬可以帮忙看看,非常感激
1092 次点击
所在节点    问与答
4 条回复
guchengyehai1
2021-07-05 00:07:35 +08:00
有可能类没有被加载到虚拟机
guchengyehai1
2021-07-05 00:09:59 +08:00
amimo
2021-07-06 09:30:57 +08:00
实现不行,可以在 Java 层找好,然后传下来。另外,Java_com_hik_netsdk_SimpleDemo_XJni_Heart 转下来的 env 可以直接使用,不需要重新 get 。
userGyl
2021-07-06 10:00:45 +08:00
@amimo 嗯 现在是在初始化的时候提前 findclass ev 还是用上面代码获取 就 ok 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787490

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX