V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
userGyl
V2EX  ›  问与答

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

  •  
  •   userGyl · Jul 4, 2021 · 2036 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
    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();
    }


    }


    网上的一些解决方案试过了,但是无效,希望有大佬可以帮忙看看,非常感激
    4 replies    2021-07-06 10:00:45 +08:00
    guchengyehai1
        1
    guchengyehai1  
       Jul 5, 2021 via iPhone
    有可能类没有被加载到虚拟机
    amimo
        3
    amimo  
       Jul 6, 2021
    实现不行,可以在 Java 层找好,然后传下来。另外,Java_com_hik_netsdk_SimpleDemo_XJni_Heart 转下来的 env 可以直接使用,不需要重新 get 。
    userGyl
        4
    userGyl  
    OP
       Jul 6, 2021
    @amimo 嗯 现在是在初始化的时候提前 findclass ev 还是用上面代码获取 就 ok 了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2988 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 14:50 · PVG 22:50 · LAX 07:50 · JFK 10:50
    ♥ Do have faith in what you're doing.