安卓/手游逆向交流群963612891
jni开发
步骤:
1. 定义字符或者是方法,被native修饰;
2.Java -jni命令,生成被native修饰的.h文件;
3.h里面的东西赋值到.c,补充完整:添加参数、添加方法体;
配置两个mk文件
4.执行ndk命令生成so文件
5.回到Java层,加载so
6.加载保存,运行
jni静态注册
以调用C层字符串
1. 定义字符或者是方法,被native修饰;
2. Java -jni命令,生成被native修饰的.h文件;
注:要在文件src目录下 输入命令 >javah -jni 被定义的native 所在类的路径
3. h里面的东西赋值到.c,补充完整:添加参数、添加方法体;
函数名 .h文件生成
这里要结合jni.h文档看 找到方法
4. 配置两个mk文件
加入两个文件(Android.mk Application.mk),跟.c .h文件放一块
5. 执行ndk命令生成so文件
6. 回到Java层,加载so
7. 加载保存,运行
Jni接口
1.看有没有返回值,有要定义变量接收 无就不用管
2.*env-> 指出来 删掉后面括号
3. 把参数补充完整
动态注册
流程跟静态差不多 要注意绑定Java和C进行绑定
typedef struct {
const char* name; //第一个参数 name 是java 方法名;
const char* signature; //第二个参数 signature 用于描述方法的参数与返回值,也就是java方法签名信息,
void* fnPtr; //第三个参数 fnPtr 是函数指针,指向 jni 函数;
} JNINativeMethod;
例子:JNINativeMethod nativeMethod[]{
{“add”,”(FF)F”,(void*)addc}
{“add”,”(FF)F”,(void*)subc}
{“add”,”(FF)F”,(void*)mulc}
{“add”,”(FF)F”,(void*)divc}
};
RegisterNatives注册方法
//第一个 env 第二个 class 第三个 数组名
第四个 数组个数 sizeof(JNINativeMethod)/sizeof(JNINativeMethod[0])
jint(*RegisterNatives)(JNIEnv*,jclass,const,JNINativeMethod*,jint);
jint (*GetEnv)(JavaVM*, void**, jint);//第三个版本号(return)
第二个 (void**)&env 第一个vm
来源:oschina
链接:https://my.oschina.net/u/4472804/blog/3196616