ndk学习18: JNI之C&C++调用Java

时间:2023-02-03 10:12:28

一.Java反射机制
先了解Java反射机制原理
ndk学习18: JNI之C&C++调用Java

例子网上很多,反射很灵活


二. 在JNI层调Java
用途: Java层逆向比较容易,增加逆向门槛,把调用都写到JNI层,  让Java层无调用关系
注意: C和C++有所不同,这里使用C++作为例子

1. 首先在代码中提供一个ShowLog函数
private void ShowMsg() {
    Log.d("_BING_", "ShowMsg");

}  


2. 在上次的Add例子加入代码
JNIEXPORT jint JNICALL Java_org_bing_testjni_MainActivity_Add
  (JNIEnv *env, jobject obj, jint a, jint b)
{
    while (true){
        //反射调用java代码
        jclass cls = env->FindClass("org/bing/testjni/MainActivity");
        if (cls == NULL) {
            break;
        }
        jmethodID ShowMsg = env->GetMethodID(cls, "ShowMsg", "()V");
        if (ShowMsg == NULL) {
            break;
        }
        // 调用构造初始化
//        jmethodID init = env->GetMethodID(cls, "<init>", "()V");
//        jobject obj1 = env->NewObject(cls, init);
        env->CallVoidMethod(obj, ShowMsg);
        break;
    }
    return a + b;

}


3. 如上的函数签名信息如何获取
在工程bin/classes目录下 输入命令:
javap -p -s org.bing.testjni.MainActivity
javap -p -s 包名.类名
ndk学习18: JNI之C&C++调用Java
同样可以将生成头文件和查询都做成脚本 方便使用

3. 输出结果
ndk学习18: JNI之C&C++调用Java