一个 jni 相关问题,希望大佬可以解惑

2021-07-04 23:14:18 +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
.._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();
}


}


网上的一些解决方案试过了,但是无效,希望有大佬可以帮忙看看,非常感激
1737 次点击
所在节点    程序员
3 条回复
userGyl
2021-07-05 00:20:34 +08:00
问题已粗暴解决,🧲此贴终结
cache
2021-07-05 10:16:05 +08:00
错误很明显啊,你的 JavaVM 没有包括 App 的 classloader,

JNI 调用时已经传了 JNIEnv 参数,你为什么不直接用?
userGyl
2021-07-05 17:19:07 +08:00
@cache 直接用才有的问题,所以改成现在这样,但是 FindClass 还是为空,所以我现在放在了初始化的时候就解决了

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

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

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

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

© 2021 V2EX