Android Studio 3.0 JNI开发详解

本文详细介绍了在Android Studio 3.0中进行JNI开发的步骤,包括创建新工程、配置NDK和CMake环境、创建Android Library、生成JNI接口、制作JAR包与.so动态库打包,以及在新项目中使用这些资源的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Studio 3.0 JNI开发详解

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

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

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

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


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

    安装:

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


    配置:

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

    我这里NDK安装在:


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


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



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

1、在当前项目的Project视图模式下,新建一个Android Library



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


    例如,这里新建的JAVA类:


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



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

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


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

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


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

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


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

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


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


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

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


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

8、.so库的生成

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


    生成的.so动态库如下:


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

1、生成JAR包规则配置

    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)

2、生成JAR包


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

    des\build\JNIDes_V1.0.jar

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

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



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

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


2、添加与配置jar包

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


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


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

3、JNI接口的调用


四、结束

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值