JNI开发音视频开发

C++主线程调用Java方法

2018-11-10  本文已影响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日晚

上一篇下一篇

猜你喜欢

热点阅读