JNI函数的绑定:每一个JAVA层函数在native层都对应一个ArtMethod对象,JNI函数在执行前必须完成JNI函数所在类的加载和初始化、以及该JNI函数的ArtMethod对象当中属性和So中具体函数地址的绑定。
JNI函数绑定的分类:
1、静态:
两次绑定,第一次是在类加载的时候,会绑定到Art中的“桥函数”;第二次绑定是在该Jni函数第一次被真正调用时候,由Art完后该JNI函数在So中地址的查询以及绑定。
art_jni_dlsym_looup_stub_(汇编实现)->artFindNativeMethod->FindCodeForNativeMethod(method)
2、动态:
两次绑定,不同于静态的两次在于由开发人员编写代码主动进行绑定,而不是由art帮助完成绑定。
不管静态或者动态注册,最后都会到达:const void* ArtMethod::RegisterNative函数中的SetEntryPointFromJni(new_native_method)函数
function hookJniRegister() {
var Regiseteraddr = Module.findExportByName("libart.so","_ZN3art9ArtNethod14RegisterNativeEPKvb");
Interceptor.attach(Regiseteraddr, {
onEnter: function (args) {
console. log("go into RegisterNative" );
var artmethodptr = args[0];
var dex_method_index_ = Memory.readU32(ptr(artmethodptr).add(12));
var funcaddr = args[1];
console.log ("RegisterNative :" + dex_method_index_ + " - -funcaddr:" + funcaddr);},
onLeave: function (retval){
}
}