V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
userGyl
V2EX  ›  程序员

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

  •  
  •   userGyl · 2021-07-04 23:14:18 +08:00 · 1729 次点击
    这是一个创建于 1257 天前的主题,其中的信息可能已经有所发展或是发生改变。
    流程是在 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();
    }


    }


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

    JNI 调用时已经传了 JNIEnv 参数,你为什么不直接用?
    userGyl
        3
    userGyl  
    OP
       2021-07-05 17:19:07 +08:00
    @cache 直接用才有的问题,所以改成现在这样,但是 FindClass 还是为空,所以我现在放在了初始化的时候就解决了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:33 · PVG 11:33 · LAX 19:33 · JFK 22:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.