一.Java反射机制
先了解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 包名.类名
同样可以将生成头文件和查询都做成脚本 方便使用
3. 输出结果
ndk学习18: JNI之C&C++调用Java