Android NDK开发(一)- 基础应用

Android对C++进行了兼容,可以通过jni层调用C++的代码,学生时代有几年C++开发经历,对其相关知识比较熟悉。正好最近在修改项目的native签名代码,特意抽空记录下开发过程。

准备工作

NDK目录配置:
1、下载完成之后解压压缩包
2、在Project根目录下的local.properties中增加一行配置ndk.dir=${ndk_path}

开发步骤

1、新建jni文件夹
AS的默认jni文件夹是在main下面,与java目录同级。
![KWSSLLXLA72}1OQQEOPARJ.jpg](http://upload-images.jianshu.io/upload_images/1928639-12651347c23dcd56.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 也可以指定jni目录,设置方法是在目标module的build.gradle中增加代码jni.srcDirs = ["${目标文件夹路径}"]`,如下所示:

0276E687-08FC-449C-9192-95600D7F470E.png

2、配置build.gradle
defaultConfig节点下面添加ndk配置代码
ndk { moduleName "${Your So Lib Name}" }
build.gradle如下所示:
![Q2}LE}X]%}E@RLAMW}SQTPK.jpg](http://upload-images.jianshu.io/upload_images/1928639-4e0ccd887c82ffb4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

NDK还可以配置如下选项

    stl "stlport_shared"                      //Use shared stlport library
    cFlags "-DANDROID_NDK -D_DEBUG DNULL=0"   //预定义宏
    ldLibs "log"                               //链接库列表
    abiFilters "armeabi", "armeabi-v7a", "x86"  //打包平台
}```
**常见问题:**
* `Error:(2, 18) string: No such file or directory` 
*解决方法:*添加` stl "stlport_shared"`到ndk节点下。
*原因:* C++代码使用了这个库中的代码,所以要把库添加到编译选项。
* `Error: NDK integration is deprecated in the current plugin` 
*解决方法:*在project根目录下的`gradle.properties`中添加配置`android.useDeprecatedNdk=true`。
* `no rule to make target....`
*解决方法:* 新建一个空的empty.c文件
*原因:* JNI 的bug

3、声明并生成native方法
    前两步只是配置环境,配置好开发环境后就可以进行C++代码编写,但为了让java代码能够正确识别和调用C++的代码,其对外函数的声明需要进行一些特殊的处理:
* 在java类中定义一个native方法,native方法的声明只是在普通的java静态方法声明加上`native`关键字。如:
![6NX6`5]BLVIQ)1}D0]TIN9S.jpg](http://upload-images.jianshu.io/upload_images/1928639-03039e476b3cea9b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 编译project,生成对应类的class文件
* 找到定义native方法的class文件,使用javah命令生成对应的头文件。以NativeMethod.class为例,在终端输入:` cd app/build/intermediates/classes/debug/
`,然后输入`javah -jni ling.jnitest.NativeMethods
`,其中`ling.jnitest`是`NativeMethods`类的包名
![A8480C58-BC21-4581-8E05-801732288C97.png](http://upload-images.jianshu.io/upload_images/1928639-6a356bd89b87bc09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)如果没有报错,在debug目录下会生成一个头文件
![D3239FA4-C3AB-4D09-AC3E-A95D4876BD69.png](http://upload-images.jianshu.io/upload_images/1928639-de4faa58e7e31f5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
* 复制头文件至jni目录,并根据头文件新建一个同名的cpp文件,在该cpp文件内就可以编写C代码。最终目录结构如图所示
![1B092C07-7EDE-4FDE-B583-FE043EF2D509.png](http://upload-images.jianshu.io/upload_images/1928639-7dac463ed71fc4a4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
输出一条日志到logcat
![730624DE-074C-461F-8AF5-4B8D5189933C.png](http://upload-images.jianshu.io/upload_images/1928639-b58221fe7606efe4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
**常见问题:**
* `错误: 找不到类android.content.Context。` 
*解决方法:* `javah -classpath ./:${android.jar path} -jni ling.jnitest.NativeMethods`。
*原因:* 使用了一些非jdk预定类,导致无法找到引用的类,所以在打包的时候需添加class路径,如引用了android sdk里的类则需添加android.jar的路径,如存在多个路径则使用`:`连接。
![64D49FD8-EF86-4AB6-A66C-8FD3B9A67015.png](http://upload-images.jianshu.io/upload_images/1928639-e52d0f60fce47fcf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

万里长征走完第一步,上面对Android Studio开发jni的开发环境、基本配置以及常见问题进行了详细说明,后续将对C++与java层的一些相互调用,对系统API的调用进行讲解。

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

推荐阅读更多精彩内容