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 的步骤

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容