好友
阅读权限10
听众
最后登录1970-1-1
|
通过我们 在java中 jni动态注册接口方法时 得知
动态注册的过程 是在 JNI_OnLoad 方法里 进行的
getEnv ->FindClass ->RegisterNatives
RegisterNatives 方法里注册的
(*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,jint)
JNINativeMethod 指向的数组
nativeMethods 数组里 就是 要动态注册的 对应的方法
在 JNINativeMethod 类型的 nativeMethods 数组里的
JNINativeMethod nativeMethods[]={
//java方法 方法签名 C函数
{"add","(FF)I",(void*)add},
{"sub","(FF)I",(void*)sub},
{"mul","(FF)D",(void*)mul},
{"div","(FF)D",(void*)_div}
};
有了上面的 了解后 就好办了
那么我们就到 JNI_OnLoad 方法里去找
导入jni.h 头文件
LDR R3, [R3,#0x18] //把类似这样的 基址+偏移 右键修改成 jni方法
如
LDR R3, [R3,#JNIInvokeInterface.GetEnv]
如果知道了 动态注册的流程 那么就很轻松的就会把下面的 依次修改成
LDR R3, [R3,#JNINativeInterface.FindClass]
LDR.W R4, [R2,#JNINativeInterface.RegisterNatives]
我们知道 动态注册 是在 RegisterNatives 里进行的
而这个方法的 第3个参数 就是我们要追踪的 nativeMethods
汇编里 即是 寄存器R2 作为第三个参数
即找到这
LDR R2, [R2] ; nativeMethods
双击 nativeMethods
直接跳到 地址指向的数据处了
.data:00004004 EXPORT nativeMethods
.data:00004004 nativeMethods DCD aAdd ; DATA XREF: LOAD:000002A8↑o
.data:00004004 ; .text:000012C4↑o ...
.data:00004004 ; "add"
.data:00004008 DCD aFfI ; "(FF)I"
.data:0000400C DCD _Z3addP7_JNIEnvP8_jobjectff+1 ; add(_JNIEnv *,_jobject *,float,float)
.data:00004010 DCD aSub ; "sub"
.data:00004014 DCD aFfI ; "(FF)I"
.data:00004018 DCD _Z3subP7_JNIEnvP8_jobjectff+1 ; sub(_JNIEnv *,_jobject *,float,float)
.data:0000401C DCD aMul ; "mul"
.data:00004020 DCD aFfD ; "(FF)D"
.data:00004024 DCD _Z3mulP7_JNIEnvP8_jobjectff+1 ; mul(_JNIEnv *,_jobject *,float,float)
.data:00004028 DCD aDiv ; "div"
.data:0000402C DCD aFfD ; "(FF)D"
.data:00004030 DCD _Z4_divP7_JNIEnvP8_jobjectff+1 ; _div(_JNIEnv *,_jobject *,float,float)
.data:00004030 ; .data ends
这样就ok了
java层 方法名 方法签名 c/c++ 中对应的方法
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|