V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
userGyl
V2EX  ›  程序员

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

  •  
  •   userGyl · Jul 4, 2021 · 2416 views
    This topic created in 1769 days ago, the information mentioned may be changed or developed.
    流程是在 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 replies    2021-07-05 17:19:07 +08:00
    userGyl
        1
    userGyl  
    OP
       Jul 5, 2021
    问题已粗暴解决,🧲此贴终结
    cache
        2
    cache  
       Jul 5, 2021
    错误很明显啊,你的 JavaVM 没有包括 App 的 classloader,

    JNI 调用时已经传了 JNIEnv 参数,你为什么不直接用?
    userGyl
        3
    userGyl  
    OP
       Jul 5, 2021
    @cache 直接用才有的问题,所以改成现在这样,但是 FindClass 还是为空,所以我现在放在了初始化的时候就解决了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2989 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 14:50 · PVG 22:50 · LAX 07:50 · JFK 10:50
    ♥ Do have faith in what you're doing.