jni开发
本帖最后由 怕上火喝王老吉 于 2020-3-17 11:49 编辑jni开发步骤
1. 定义字符或者是方法,被native修饰;
2.Java -jni命令,生成被native修饰的.h文件;
https://yl.qiyikt.com/data/attachment/forum/202003/09/000232r24vds2679vvecwv.png
注:要在文件src目录下 输入命令 >javah -jni 被定义的native 所在类的路径
3.h里面的东西赋值到.c,补充完整:添加参数、添加方法体;配置两个mk文件
https://yl.qiyikt.com/data/attachment/forum/202003/09/000257e97fthyfirttf1a9.png
函数名 .h文件生成
这里要结合jni.h文档看 找到方法
4. 配置两个mk文件
加入两个文件(Android.mk Application.mk),跟.c.h文件放一块
https://yl.qiyikt.com/data/attachment/forum/202003/09/000335yif75qqpq5d5ooqe.png
5. 执行ndk命令生成so文件
https://yl.qiyikt.com/data/attachment/forum/202003/09/000414qs0thzzn70jsnhoz.png
6.回到Java层,加载so
https://yl.qiyikt.com/data/attachment/forum/202003/09/000427kaajkttktm1c9c9j.png
7.加载保存,运行
Jni接口1.看有没有返回值,有要定义变量接收无就不用管2.*env->指出来删掉后面括号3. 把参数补充完整
https://yl.qiyikt.com/data/attachment/forum/202003/09/000447vwlsidi3zhi1s1ll.jpghttps://yl.qiyikt.com/data/attachment/forum/202003/09/000453ml3ngq97u4d4vvme.jpg
动态注册流程跟静态差不多 要注意绑定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)jint(*RegisterNatives)(JNIEnv*,jclass,const,JNINativeMethod*,jint);
jint (*GetEnv)(JavaVM*, void**, jint);//第三个版本号(return)第二个 (void**)&env 第一个vm
工具链接:https://pan.baidu.com/s/1Wxa-jRXx72AgUrU6icvUQA
提取码:o3uh
Java和C的混合编程么,优秀 不要再使用jni了,使用jna,这个库太完美了。 最近正想用Java和C混合起来玩一玩,就刚刚好碰到这个非常十分优秀的帖子,一定必须要留下一个好好的一个脚印,留一个mark,大大的脚印,以证明我看过了这一个这么强这么优秀的帖子。感谢楼主的无私的分享啊。 但是没有Jna方便啊。 最近也在研究这个,楼主有没有推荐看的资料,自己找了一些,都很零散
页:
[1]