初识Jni工程项目
aide吧
全部回复
仅看楼主
level 12
0_666
楼主
Jni是Java Native Interface,译为java本地接口,由于不同的语言之间是无法直接进行交互的,中间需要一个转换过程,Jni就是在Java和C/C++之间进行数据转换与连接的工具。
2017年12月18日 08点12分
1
level 12
0_666
楼主
我们先来了解一下Jni工程的目录,以及各种文件的作用。首先打开aide新建一个Native Andrord app项目,项目名和包名默认即可。
2017年12月18日 09点12分
2
level 12
0_666
楼主
主要目录有两个:src和jni,src目录下存放java文件,jni目录存放C/C++,Android.mk,appliaction.mk文件。
2017年12月18日 10点12分
3
level 12
0_666
楼主
src/com/mycompany/myndkapp/里面Hello_Jni.java的native方法,就是链接到C/C++的接口,这些方法只有声明,没有方法体,就象java接口中的抽象方法一样只能由别的类来实现,这些native方法只好由so库中的C/C++函数来实现了。
2017年12月18日 11点12分
4
level 12
0_666
楼主
HelloJni.java被虚拟机加载后,首先初始化staitc{…}里面的静态代码块,因此,libhellojni.so库被加载,接着执行下面的native方法,也叫做本地方法,但是本地方法是在so库里实现的,这样就自然地链接到C/C++代码中去了,因此有人称so和dll文件为动态链接库。
2017年12月18日 12点12分
5
level 15
º花花画海海
更新好慢
2017年12月18日 12点12分
6
level 12
拾酒斩华腾🌝
顶贴
2017年12月18日 12点12分
7
level 12
0_666
楼主
HelloJni.java文件内一共有两个用native来修饰的本地代码调用方法,第一个是stringFromJNI( ),从方法名可以看到,它是一个返回值为字符串无参数的本地方法,另外的这个unimplementedStringFormJNI( )本地方法,从方法名可以看出,它在C/C++代码中没有被实现,是无效的,aide把它写上来的意思是告诉我们:用native修饰的本地方法可以有许多个,我们想写多少都行,只要在C/C++中实现就可以了。
2017年12月18日 12点12分
8
level 12
0_666
楼主
再来看一下jni目录,它是存放C/C++文件的,C代码以 .c .cc 为后缀名,C++的后缀名通常是 .cpp,这里面有三个文件,一个cpp是C++的源码文件,另外两个后缀是mk的文件是配置文件,aide在编译so库时要用到它们。
2017年12月18日 13点12分
10
level 12
0_666
楼主
jni目录下的cpp文件是jni项目的重点,是我们实现本地方法的源代码,可以用C语言或者C++语言来写,汇编高人也可以来发挥。
2017年12月18日 13点12分
11
level 12
0_666
楼主
本例代码是很简单的,先导入两个头文件,接着实现HelloJni.java文件中的第一个本地方法,返回一个字条串,另一个方法在这里没有实现。说点怪话:这里面的代码既不像java,又不象C++代码,它是JNI自己规范的代码,要想掌握它们,必须学习JNI API文档
2017年12月18日 13点12分
12
level 12
0_666
楼主
再来说说两个后缀是 .mk的文件,Android.mk里面,我们只要关心第四行,第五行代码就行了。第四行是编译后so库的名称,随aide默认就可以了,第五行是我们需要aide编译的cpp名称,名称中还要包含完整的路径名,假如有多个cpp文件需要编译,必须都要写出来,第一个cpp以空格分开排列即可。另外的一个appliction.mk是写明NDK的版本号,还有so库的x86,armeabi-v7a版本支持,默认即可。
2017年12月18日 14点12分
13
level 12
卢卡尔伊格尼斯
留名,慢慢看
2017年12月18日 14点12分
14
1