Android Studio 3.0 JNI开发详解

Android Studio 3.0 JNI开发详解

本文仅供大家参考与学习,不足之处请批评指正。欢迎大家随意转发。

下面详细介绍整个JNI接口开发、打包和应用的过程。(基于Windows/Android Studio 3.0.1)

一、创建新工程并配置好NDK和CMake开发环境

1、使用Android Studio新建一个支持C++的项目(其他选项默认即可):

Android Studio 3.0 JNI开发详解_第1张图片

2、安装与配置NDK和CMake工具

    安装:

    打开Tools-->Android-->SDK Manager,进入SDK设置界面。然后勾选"CMake"和"NDK",并进行应用与安装(这里的截图是安装之后的效果):

Android Studio 3.0 JNI开发详解_第2张图片

    配置:

    系统环境变量path中增加NDK的路径(NDK默认与Android SDK安装路径一致):

    我这里NDK安装在:

Android Studio 3.0 JNI开发详解_第3张图片

    所以系统环境变量中添加为:

Android Studio 3.0 JNI开发详解_第4张图片

    NDK系统环境变量设置好之后,重新打开cmd并执行ndk-build,结果一般会是这样(代表配置成功):

Android Studio 3.0 JNI开发详解_第5张图片


二、创建Android Library,制作并生成JNI接口

1、在当前项目的Project视图模式下,新建一个Android Library
Android Studio 3.0 JNI开发详解_第6张图片

Android Studio 3.0 JNI开发详解_第7张图片

Android Studio 3.0 JNI开发详解_第8张图片

2、在新建的Android库模块下面,新建一个用于实现JNI接口功能的JAVA类

Android Studio 3.0 JNI开发详解_第9张图片

    例如,这里新建的JAVA类:

Android Studio 3.0 JNI开发详解_第10张图片

3、选择并对当前的des库模块进行release版本编译

Android Studio 3.0 JNI开发详解_第11张图片

Android Studio 3.0 JNI开发详解_第12张图片

编译成功的话,会生成对应目录及文件:des\build\intermediates\classes\release\com\jni\utils\des\DesTools.class

4、在终端使用javah工具生成与JNI对应的C/C++头文件

Android Studio 3.0 JNI开发详解_第13张图片

注意:javah -classpath .  com.jni.utils.des.DesTools 这句里面com.jni.utils.des.DesTools与com\jni\utils\des\DesTools.class对应。

如果成功,则在执行javah命令的那个路径下面生成对应的.h文件,例如在命令行查看:

Android Studio 3.0 JNI开发详解_第14张图片

5、JNI接口C/C++实现

        在des库模块的src/main/下面创建cpp目录,并将上面生成的.h文件转移到cpp目录,并手动在cpp目录中创建与.h同名的.c或.cpp文件;然后修改.c或.cpp文件,使包含.h文件,并实现.h中定义的函数功能(cpp目录还可以添加其他任何需要的.c/.h/.cpp等用C/C++实现的文件)。

Android Studio 3.0 JNI开发详解_第15张图片

6、添加CMakeLists.txt编译配置文件

    将当前项目app模块根目录下的CMakeLists.txt文件拷贝一份,并复制到des库模块的根目录下面:

Android Studio 3.0 JNI开发详解_第16张图片

    并修改拷贝过来的CMakeLists.txt(下面是最基本的修改内容):

Android Studio 3.0 JNI开发详解_第17张图片

7、对CMakeLists.txt的引入进行配置

    以上修改完成之后,修改des库模块根目录下的build.grandle,增加相应的CMakeLists.txt编译配置,并进行同步

Android Studio 3.0 JNI开发详解_第18张图片

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

8、.so库的生成

    正常同步完成之后,就会在des\build\intermediates\cmake\release\obj目录下生成各平台对应的.so库了。如果没有同步,则可以尝试重新对des模块进行编译:

Android Studio 3.0 JNI开发详解_第19张图片

    生成的.so动态库如下:

Android Studio 3.0 JNI开发详解_第20张图片

三、生成JNI相关的JAR包,并与.so一起另外打包

1、生成JAR包规则配置

    des库模块根目录的build.gradle文件最后添加JAR的生成规则,完成之后进行同步:

Android Studio 3.0 JNI开发详解_第21张图片

/* 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)

2、生成JAR包

Android Studio 3.0 JNI开发详解_第22张图片

    在上图的other列表下面,有一个makeJar,双击进行jar包的生成,最终生成的jar包为:

    des\build\JNIDes_V1.0.jar

3、将jar包与.so动态库打包在一起

    将JNIDes_V1.0.jardes\build\intermediates\cmake\release\obj\目录下面的相关文件(可选)放在一起进行打包:

Android Studio 3.0 JNI开发详解_第23张图片


三、包含JAR包和动态库的压缩包使用举例

1、新建一个项目,例如:

Android Studio 3.0 JNI开发详解_第24张图片

2、添加与配置jar包

    JNIDes_V1.0.zip拷贝到项目的app/lib目录下面,并解压到当前目录,然后在Android Studio中:

Android Studio 3.0 JNI开发详解_第25张图片

        下一步将配置动态库,有两种方法。一种是将armeabi-v7a等库文件夹移动到app\src\main\jniLibs目录下(没有则创建jniLibs);另一种是保留在app/libs目录,但是要在build.gradle中添加:

Android Studio 3.0 JNI开发详解_第26张图片

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

3、JNI接口的调用

Android Studio 3.0 JNI开发详解_第27张图片

四、结束

        我对Android开发只停留在理解与基础掌握层面,但上面整个过程是实践过来的,环境相同的话应该不会出现什么大的问题。如果遇到问题,也请大家多多交流。

你可能感兴趣的:(Android,Studio)