怕上火喝王老吉 发表于 2020-3-17 11:39

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




Eaglecad 发表于 2020-3-17 20:31

Java和C的混合编程么,优秀

ytfrdfiw 发表于 2020-3-17 20:46

不要再使用jni了,使用jna,这个库太完美了。

theName 发表于 2020-3-18 06:26

最近正想用Java和C混合起来玩一玩,就刚刚好碰到这个非常十分优秀的帖子,一定必须要留下一个好好的一个脚印,留一个mark,大大的脚印,以证明我看过了这一个这么强这么优秀的帖子。感谢楼主的无私的分享啊。

xuanxu 发表于 2020-3-18 08:14

但是没有Jna方便啊。

cwl 发表于 2020-3-18 15:16

最近也在研究这个,楼主有没有推荐看的资料,自己找了一些,都很零散
页: [1]
查看完整版本: jni开发