0%

JNI 和 NDK 编程(四):JNI 调用 Java 方法的流程

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");
    }
-------------------- 本文结束感谢您的阅读 --------------------