一.NDK开发流程
1、在Java里面编写native代码
2、创建JNI目录,编写C代码,生成头文件
3、配置动态链接库的名称
4、加载动态链接库
5、使用
二.利用AS生成支持JNI开发的项目
安卓机器人思路:利用AS生成支持JNI的项目,再将该JNI项目下的app moudle修改为Library,从而可以导出aar库文件,库文件中既包含了so文件也包含了java文件等。最终将此aar文件提供给第三发开发者。(之所以这么麻烦,是因为AS不支持直接生成支持jni的module)。
由于利用项目生成的默认module为app,在将此名为app的module改名后导入到我的工程中。
这里,之所以没有选择Add No Activity,是因为非空的项目中会有一个JNI示例。
一路默认下去,这一页中的有些配置还没搞太清楚。
建立完成后,打开我的工作工程,导入上述module
注意修改一下module名字。
导入成功后,将该module修改为Library类型:修改build.gradle如上图所示。
将第一行的application类型改为library类型,同时去掉applicationID配置项;
重新编译后可生成arr文件。
如若添加新的cpp文件后需将cpp文件配置到CMakeList.txt文件中:
利用解压文件将该arr文件解压,可以看到该arr中生成了jar包,jni文件夹中生成了so包。
这里jni目录下生成的名字为libnative-lib.so,由于通过向导生成的jni项目默认名称都叫native-lib,所以最终生成的so文件名都为“libnative-lib.so”,若某个项目依赖了多个同名的jni项目则会报错,所以这里要将native-lib修改为不重名的名字。由于本解决方案中app/CMake.text中也定义了名字为native-lib的library,所以会报错
解决方法:将tsjnilib的CMake文件的Library名称修改为tsjni-lib
问题完美解决:
至此即可将该aar库提供给第三方使用。使用方法为:将该aar包复制到第三方项目的libs目录下,配置build.gradle文件: