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 目录,

javah

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


Android Studio 另一种开发 NDK 的步骤

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 154,812评论 23 678
  • Android对C++进行了兼容,可以通过jni层调用C++的代码,学生时代有几年C++开发经历,对其相关知识比较...
    LiTran阅读 960评论 0 16
  • 秋天的季节,航小姆开始喜欢晒太阳了,每天迷瞪着眼,在房间的窗台上睡一觉,或者从窗户跳出去,在外面溜达一会,它的溜达...
    喵星人Yoga阅读 99评论 0 1
  • 最近引起我注意辅导班的理由,是发生在我老家邻县临清的一幕惨剧:一个六年级小男孩在他班主任家里参加辅导班,四月二号那...
    卧龙饮水阅读 68评论 0 2
  • 阴冷的天气是否有回暖的气息 听闻下周是个大晴天 久违的晴天要恰到好处的阳光 阳光那么好,春光那么绚烂 我们就见面吧
    宠坏阅读 69评论 0 0