Android NDK 开发(一)
一、NDK 产生的背景
Android 平台从诞生起,就支持 C、C++ 开发。Android 的 SDK 基于 Java 实现,这意味着基于 Android SDK 进行开发的第三方应用都必须使用 Java 语言。在 Android SDK 首次发布时,Google 就宣称其虚拟机 Dalvik 支持 JNI 编程方式,也就是第三方应用完全可以通过 JNI 调用自己的 C 动态库。
JNI:Java Native Interface 也就是 java 本地接口,它是一个协议,这个协议用来沟通 java 代码和本地代码(c/c++)。通过这个协议,Java 类的某些方法可以使用原生实现,同时让它们可以像普通的 Java 方法一样被调用和使用,而原生方法也可以使用 Java 对象,调用和使用 Java 方法。也就是说,使用JNI这种协议可以实现:java 代码调用 c/c++ 代码,而 c/c++ 代码也可以调用 java 代码。
NDK:Native Development Kit。Google 为便于 Android 开发提供的一种原生开发集,包含 API、构建工具、交叉编译、调试器、文档示例等一系列的工具集,可以帮助开发者快速开发 C(或 C++)的动态库,并能自动将 so 和 java 应用一起打包成 APK。
NDK 集成了交叉编译器,并提供了相应的 mk 文件隔离 CPU、平台、ABI 等差异,开发人员只需要简单修改 mk 文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出 so。
二、NDK 环境搭建
1、安装配置 NDK
2、Android Studio 关联 NDK
1)在 local.properties 中添加 NDK 目录
local.properties
2)在工程中 gradle.properties 中添加对旧版本的 NDK 支持的配置
gradle.properties
3)在该项目下的 build.gradle 配置生成的 so 名称和支持的 cpu 类型
在 android->defaultConfig下添加如下代码:
ndk{
moduleName "Java2C" //so文件名
abiFilters "armeabi", "armeabi-v7a", "x86" //CPU类型
}
ndk
在这里不配置也是可以的,系统会用默认的项目名称作为 so 文件的名称,并且 cpu 也将会支持全部类型,只是当我们的项目名称改变的时候,在我们引用加载 so 文件的地方也需要改变,不改变的话就出现找不到 so 库的异常,所以,这里配置只是为了便利系统生成我们制定的 so 文件名,而不是根据项目名称生成。
当添加了上述配置后可能会出现如下错误;
三、NDK 开发步骤
1、定义 Native 方法
native 方法2、通过 javah 命令生成头文件
在项目根目录下,进入 main->java 目录,在命令中执行 javah com.sanhui.ndkdemo.Java2CJNI 命令:
这时可能会报找不到类文件的错误,执行 set classpath=xxx
命令将 class 路径设置为 java 目录,
3、在main目录下创建一个jni文件夹,并把头文件转移到该文件夹下
4、创建实现头文件的.C源文件
在jni目录下创建一个Java2C.c的源文件,通过#include引入我们的头文件com_sanhui_ndkdemo_Java2CJNI.h,并把在头文件下的声明方法JNIEXPORT jstring JNICALL Java_com_sanhui_ndkdemo_Java2CJNI_java2C(JNIEnv *, jobject);复制到我们的Java2C.c中,补全方法参数,并实现一个C字符串“I am From Native C .”的返回:
这里的方法名格式=Java_包名类名Java native 方法名(包名里的.变为,变为1)
5、加载 so 库
在 native 方法所在的类中加载 so 库
6、生成 so 文件
Build->Rebuild Project,进行重新编译工程,然后AS会为我们生成so文件,so文件所在目录为:build\intermediates\ndk\debug\lib