1. JNI 调用 Java 方法流程概述
JNI 调用 Java 方法的流程是先通过类名找到类,然后再根据方法名找到方法的 id,最后就可以调用这个方法了
如果是调用 Java 中的非静态方法,那么需要构造出类的对象后才能调用它
Demo
1
2
3
4// 首先在 Java 中定义一个静态方法供 JNI 调用
public static void methodCalledByJni(String msgFromJni) {
Log.d(TAG, "methodCalledByJni, msg: " + msgFromJni);
}1
2
3
4
5
6
7
8
9
10
11
12
13
14// 然后在 JNI 中调用上面定义的静态方法
void callJavaMethod(JNIEnv *env, jobject thiz) {
jclass clazz = env -> FindClass("com/szy/JniTestApp/MainActivity");
if (clazz == NULL) {
printf("find class MainActivity error!");
return;
}
jmethodID id = env -> GetStaticMethodID(clazz, "methodCalledByJni", "(Ljava/lang/String;)V");
if (id == NULL) {
printf("find method methodCalledByJni error!");
}
jstring msg = env -> NewStringUTF("msg send by callJavaMethod in test.cpp");
env -> CallStaticVoidMethod(clazz, id, msg);
}1
2
3
4
5
6// 最后在 Java_com_szy_JniTestApp_MainActivity_get 方法中调用 callJavaMethod 方法
jstring Java_com_szy_JniTestApp_MainActivity_get(JNIEnv *env, jobject thiz) {
printf("invoke get in C++\n");
callJavaMethod(env, thiz);
return env -> NewStringUTF("Hello from JNI in libjni-test.so");
}