C++主线程调用Java方法
2018-11-10 本文已影响0人
未见哥哥
1. C++ 全局调用Java方法
1.1 C++主线程调用Java方法
在 Android C++多线程-创建子线程中演示了在 Java 层调用 native 层的方法,但是如何在 native 层去调用 Java 层的方法呢?
下面这个类,我们想在调用 callJavaMethodOnCPPMainThread
方法之后,然后在 native 层回调 JniThreadDemo
的 onSuccess
的方法。
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日晚