V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
userGyl
V2EX  ›  问与答

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

  •  
  •   userGyl · 2021-07-04 23:04:12 +08:00 · 1061 次点击
    这是一个创建于 998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    流程是在 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 条回复    2021-07-06 10:00:45 +08:00
    guchengyehai1
        1
    guchengyehai1  
       2021-07-05 00:07:35 +08:00 via iPhone
    有可能类没有被加载到虚拟机
    amimo
        3
    amimo  
       2021-07-06 09:30:57 +08:00
    实现不行,可以在 Java 层找好,然后传下来。另外,Java_com_hik_netsdk_SimpleDemo_XJni_Heart 转下来的 env 可以直接使用,不需要重新 get 。
    userGyl
        4
    userGyl  
    OP
       2021-07-06 10:00:45 +08:00
    @amimo 嗯 现在是在初始化的时候提前 findclass ev 还是用上面代码获取 就 ok 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2939 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:04 · PVG 22:04 · LAX 07:04 · JFK 10:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.