流程是在 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();
}
}
网上的一些解决方案试过了,但是无效,希望有大佬可以帮忙看看,非常感激
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/787492
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.