初探JNI与NDK


简介

成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~。

一直以来,对JNI和NDK这块并没有进行比较系统的学习,今天,打算循序渐进,把JNI和NDK这块的知识来全面的学习一下。

JNI

(what)定义:java native interface(即java本地接口)
        作用:使java与本地类型语言(如C、C++)交互
(why)在某些情况下,java需要与本地类型语言进行交互,但是由于java具备跨本台的特点,所以与本地类型语言的交互能力比较弱,所以使用JNI来增强与本地类型语言的交互能力
(how)详情见Android Studio实现NDK部分

NDK

(what)定义:native development kit(即本地开发工具包)
        作用:快速开发C、C++的动态库,并自动把so和应用打包成apk,其就是一种在Android中使用jni与本地类型语言(如C、C++)交互的方式
        特点:
            1、性能方面:
                1、运行效率高
                在开发高性能的需求中,采用C、C++更有效率,本地代码(C、C++)执行算法的效率更高
                2、代码安全性高
                java是半解释性语言,容易被反汇编后得到源代码,而本地有些代码(C、C++)则不会,提高代码的安全性
            2、功能方面:
                1、功能扩展性强
                能够使用其它语言的开源库
            3、使用方面:
                1、代码可复用及移植
                使用本地语言(C、C++)开发的代码还可应用于其它支持该语言的平台
            4、其它方面:
                1、NDK提供的库有限,仅用于处理算法和敏感问题
                2、提供了交叉编译器,用于生产特定平台的CPU动态库
(why)方便在Android中使用JNI与本地语言进行交互。
(how)详情见Android Studio实现NDK部分

JNI与NDK的关系

1、JNI是实现的目的,而NDK是在Android中实现JNI的手段,即在Android开发环境中,通过NDK实现JNI的功能。
2、NDK提供了把.so文件和应用打包成apk的工具,而JNI没有,它只是把.so文件放在文件系统的特定位置。

Android Studio实现NDK

一、Android Studio2.2之前实现NDK

1、配置NDK开发环境
    1、下载Android NDK工具包
    2、解压NDK包
    3、安装&配置NDK包
2、关联Android Studio项目与NDK
    1、在Gradle的本地local.properties中添加配置
    ndk.dir=/Users/JsonChao/Library/Android/sdk/ndk-bundle
    2、在Gradle的gradle.properties中添加配置
    // 对旧版本的NDK支持
    android.useDeprecatedNdk=true 
    在app的build.gradle的defaultConfig中添加ndk节点
    添加对应的moduleName(.so文件名)或者其它需要的功能
3、创建本地代码文件
    如果本地代码时C、C++,那么需要使用extern “C”{}把代码包进去
    JNIEXPORT、jstring、JNICALL中的JNIEXPORT、JNICALL不能省略
    关于方法名构成:
    Java_包名_类名_方法名(Java首字母需要大写)
    包名中的.变_,_变_1
    新建src/main/jni,放入xxx.cpp文件
    java与JNI数据类型对应的关系:
    八大基本数据类型int->jint(前面直接加j)
    void不变
    Objec、class、String、Throwable->jobject(前面加j,第二个字母小写)
    八大基本数据类型和Objec、class、String数组化
    Object[]->jobjectArray(前面加j,第二个字母小写,[]数组符号变英文Array)
4、创建Android.mk文件
    作用:指定源码编译的配置信息
    如工作目录、编译的模块的名称、编译的文件等等
    放入src/main/jni中
5、创建Application.mk文件
    作用:配置编译平台相关内容
    APP_ABI:armeabi(Android平台主要是使用armeabi)
    放入src/main/jni中
6、进入src/main/jni中,使用ndk-build命令编译生成.so文件,成功后,生成libs&obj文件夹,.so文件在libs的armeabi文件夹中
7、在新建的src/main/jniLibs文件夹中放入armeabi文件夹
8、加入如下代码,在Android Studio中使用NDK实现jni功能
//加载.so文件
{
    System.loadLibrary("hello_jni");
}

//映射的本地方法
public native String getFromJni();

二、Android Studio2.2之后实现NDK

Android Studio内部已经集成了NDK,所有只需在Android Studio内部配置即可。

1、创建工程选择NDK选项,根据提示完成配置
2、AS会直接生成C++代码,根据需求修改即可使用。

赞赏

如果这个库对您有很大帮助,您愿意支持这个项目的进一步开发和这个项目的持续维护。你可以扫描下面的二维码,让我喝一杯咖啡或啤酒。非常感谢您的捐赠。谢谢!




Contanct Me

● 微信:

欢迎关注我的微信:bcce5360

● 微信群:

微信群如果不能扫码加入,麻烦大家想进微信群的朋友们,加我微信拉你进群。



● QQ群:

2千人QQ群,Awesome-Android学习交流群,QQ群号:959936182, 欢迎大家加入~

About me

很感谢您阅读这篇文章,希望您能将它分享给您的朋友或技术群,这对我意义重大。

希望我们能成为朋友,在 Github掘金上一起分享知识。

坚持原创技术分享,您的支持将鼓励我继续创作!