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

jni 调用 Java 方法。

  •  
  •   andychen20121130 · 2018-11-02 10:03:46 +08:00 · 1459 次点击
    这是一个创建于 2218 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 native 使用了线程。使用 pthread_join( pthread[j], &varResult);等待线程结束 。这里用 varResult 接收处理完的结果。然后把它传到 java 层。我在 java 层定义了一个静态方法 void callJavaMethod( JNIEnv env, jobject thiz,void data);

    这个是 native 层调用 java 的方法会出错。大神帮忙看一下。

    void callJavaMethod( JNIEnv env, jobject thiz,void data){ // 先找到要调用的类 jclass clazz = env -> FindClass("com/example/administrator/myopencv/MainActivity");

    if (clazz == NULL){
        printf("find class MainActivity error !");
        return;
    }
    // 获取 java 方法 id
    // 参数二是调用的方法名,  参数三是方法的签名
    jmethodID id = env -> GetStaticMethodID(clazz, "methodCalledByJni", "(Ljava/lang/String;)V");
    
    if (id == NULL){
        printf("find method methodCalledByJni error !");
        return;
    }
    jstring msg = env->NewStringUTF((const char*)data);
    
    // 开始调用 java 中的静态方法
    env -> CallStaticVoidMethod(clazz, id, msg);
    

    }

    报错提示:JNI DETECTED ERROR IN APPLICATION: JNI FindClass called with pending exception 'java.lang.IllegalArgumentException' thrown in unknown throw location in call to FindClass

    2 条回复    2018-11-02 10:52:35 +08:00
    undeflife
        1
    undeflife  
       2018-11-02 10:14:07 +08:00
    GetStaticMethodID 的地一个参数不应该是 env 吗?

    jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz,
    const char *name, const char *sig);

    https://docs.oracle.com/javase/8/docs/technotes/guides/jni/spec/functions.html#GetStaticMethodID
    andychen20121130
        2
    andychen20121130  
    OP
       2018-11-02 10:52:35 +08:00
    @undeflife 可以不需要。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3439 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:53 · PVG 18:53 · LAX 02:53 · JFK 05:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.