Android Studio 3.0 JNI开发详解
本文仅供大家参考与学习,不足之处请批评指正。欢迎大家随意转发。
下面详细介绍整个JNI接口开发、打包和应用的过程。(基于Windows/Android Studio 3.0.1)
安装:
打开Tools-->Android-->SDK Manager,进入SDK设置界面。然后勾选"CMake"和"NDK",并进行应用与安装(这里的截图是安装之后的效果):
配置:
系统环境变量path中增加NDK的路径(NDK默认与Android SDK安装路径一致):
我这里NDK安装在:
所以系统环境变量中添加为:
NDK系统环境变量设置好之后,重新打开cmd并执行ndk-build,结果一般会是这样(代表配置成功):
例如,这里新建的JAVA类:
编译成功的话,会生成对应目录及文件:des\build\intermediates\classes\release\com\jni\utils\des\DesTools.class
注意:javah -classpath . com.jni.utils.des.DesTools 这句里面com.jni.utils.des.DesTools与com\jni\utils\des\DesTools.class对应。
如果成功,则在执行javah命令的那个路径下面生成对应的.h文件,例如在命令行查看:
在des库模块的src/main/下面创建cpp目录,并将上面生成的.h文件转移到cpp目录,并手动在cpp目录中创建与.h同名的.c或.cpp文件;然后修改.c或.cpp文件,使包含.h文件,并实现.h中定义的函数功能(cpp目录还可以添加其他任何需要的.c/.h/.cpp等用C/C++实现的文件)。
将当前项目app模块根目录下的CMakeLists.txt文件拷贝一份,并复制到des库模块的根目录下面:
并修改拷贝过来的CMakeLists.txt(下面是最基本的修改内容):
以上修改完成之后,修改des库模块根目录下的build.grandle,增加相应的CMakeLists.txt编译配置,并进行同步。
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
正常同步完成之后,就会在des\build\intermediates\cmake\release\obj目录下生成各平台对应的.so库了。如果没有同步,则可以尝试重新对des模块进行编译:
生成的.so动态库如下:
在des库模块根目录的build.gradle文件最后添加JAR的生成规则,完成之后进行同步:
/* added */
def SDK_NAME = "JNIDes"; //sdk的名字
def SDK_VERSION = "_V1.0"; //版本
def sdkDestinationPath = "build";
def zipFile = file('build/intermediates/bundles/release/classes.jar')//注意这里的release可能是debug或者是default
task deleteBuild(type: Delete) {
//最终生成的jar的名字
delete sdkDestinationPath + SDK_NAME + SDK_VERSION + ".jar"
}
task makeJar(type: Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main',includes: ['assets/**'])
baseName = SDK_NAME + SDK_VERSION
destinationDir = file(sdkDestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
在上图的other列表下面,有一个makeJar,双击进行jar包的生成,最终生成的jar包为:
des\build\JNIDes_V1.0.jar
将JNIDes_V1.0.jar和des\build\intermediates\cmake\release\obj\目录下面的相关文件(可选)放在一起进行打包:
将JNIDes_V1.0.zip拷贝到项目的app/lib目录下面,并解压到当前目录,然后在Android Studio中:
下一步将配置动态库,有两种方法。一种是将armeabi-v7a等库文件夹移动到app\src\main\jniLibs目录下(没有则创建jniLibs);另一种是保留在app/libs目录,但是要在build.gradle中添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
我对Android开发只停留在理解与基础掌握层面,但上面整个过程是实践过来的,环境相同的话应该不会出现什么大的问题。如果遇到问题,也请大家多多交流。