美文网首页JNI开发音视频开发
C++主线程调用Java方法

C++主线程调用Java方法

作者: 未见哥哥 | 来源:发表于2018-11-10 18:25 被阅读0次

    1. C++ 全局调用Java方法

    1.1 C++主线程调用Java方法

    Android C++多线程-创建子线程中演示了在 Java 层调用 native 层的方法,但是如何在 native 层去调用 Java 层的方法呢?
    下面这个类,我们想在调用 callJavaMethodOnCPPMainThread 方法之后,然后在 native 层回调 JniThreadDemoonSuccess 的方法。

    public class JniThreadDemo {
    
        private static final String TAG = JniThreadDemo.class.getSimpleName();
    
        static {
            System.loadLibrary("native-thread-lib");
        }
        //在主线程中调用 onSuccess 方法
        public native void callJavaMethodOnCPPMainThread();
    
        public void onSuccess(String msg) {
            Log.i(TAG, "JNI 回调 Java层 onSuccess 方法:" + msg);
        }
    }
    
    

    实际的调用函数

    public void callJavaMethodOnCppMainThread(View view) {
        JniThreadDemo jniThreadDemo = new JniThreadDemo();
        //在主线程调用
        jniThreadDemo.callJavaMethodOnCPPMainThread();
    }
    

    上面演示的只是调用了 jniThreadDemo.callJavaMethodOnCPPMainThread 函数,下面我们来看看如何在 native 层去回调 onSuccess 函数的。

    1.1.1 获取到 jclass

    根据 jobject 获取到 jclass

    jclass jclz = env->GetObjectClass(instance);
    

    1.1.2 获取到 jmethodid

    因为要回调 Java 层的 onSuccess 函数,所以需要在这里定义具体要调用的函数名字和函数签名,具体如何获取函数签名,请点击JNI函数签名来了解

    jmethodID jmethod = env->GetMethodID(jclz, "onSuccess", "(Ljava/lang/String;)V");
    

    1.1.3 调用 Java 方法

    jenv->CallVoidMethod(jobj, jmid, code, jmsg) 
    

    下面是 C++ 的全部代码

    //在 c++ 主线程调用 Java 方法。
    extern "C"
    JNIEXPORT void JNICALL
    Java_com_example_lib_JniThreadDemo_callJavaMethodOnCPPMainThread(JNIEnv *env, jobject jobj) {
    
        jclass jclz = env->GetObjectClass(jobj);
    
        jmethodID jmethod = env->GetMethodID(jclz, "onSuccess", "(Ljava/lang/String;)V");
    
        char *msg = "Msg From C++ Thread";
    
        jstring jmsg = env->NewStringUTF(msg);
    
        env->CallVoidMethod(jobj, jmethod, jmsg);
    
        env->DeleteLocalRef(jmsg);
    }
    

    记录于 2018年11月10日晚

    相关文章

      网友评论

        本文标题:C++主线程调用Java方法

        本文链接:https://www.haomeiwen.com/subject/wvftfqtx.html