NDK简介
1.NDK是一系列工具的集合
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
2.NDK提供了一份稳定、功能有限的API头文件声明
Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。
优点
- 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
- 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
- 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
- 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。
NDK开发环境的搭建
NDK和CMake 的下载和安装
可以直接通过打开SDK进行下载和安装
由于NDK的工具包较大, 也可以选择从网站中下载: https://developer.android.google.cn/ndk/downloads/index.html, 选择自己对应的版本下载即可, 不过通过这种方法一定要修改local.properties文件, 在里面添加:
//后面改成自己下载后解压的路径名
ndk.dir=E:\ProgramFiles\Android\NDK\android-ndk-r16-beta1
也可以如下图,点击Project Structure(或者点击File,选择Project Structure),然后选择Android NDK location(NDK的解压目录)点击ok就行了。
关于CMake
1.CMakeList.txt 是脚本文件, 需要指定包含哪些源代码;
2.可以写一些条件语句, 实现不同的代码包含
3.add_library 表示编译一个代码库, 内部包含了代码库的名称, 以及源代码有哪些
NDK两种开发模式
1.ndk-build 形式; Android Studio 2.2之前的模式
2.CMake 形式: CLion C/C++编辑器; AS2.2之后整合了CLion代码, AS就支持了CMake形式的NDK开发
创建工程
1.新建工程, 选中Include C++ Support
2.一路Next之后, 在最后Finish页面尽量选中图示两项, 这样会给我们包裹一些特定的示例代码, 帮助我们理解和使用
3.在app的build.gradle配置需要.so文件(还未生成.so文件)
4.修改native-lib.cpp内容
5.查看下MainActivity内容
6.运行项目
7.查看生成的.so文件
Note1
C代码库生成的名称规则
1. 如果栈顶代码库名称为 “nh” 那么生成的文件必定是libnh.so
命名规则: lib库名.so
2. System.loadLibrary(库名); //此处不能包含前面的lib和后面的.so对于JNIEnv *env来说,在C中调用:
Note2
(*env)->NewStringUTF(env, “Hello from JNI!”);而在C++中如果按照上述调用则会发生’base operand of ‘->’ has non-pointer type ‘_JNIEnv”错误,需要如下调用:
env->NewStringUTF(“Hello from JNI!”);
原因:参见jni.h中对于JNIEnv的定义:
#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
#else
typedef const struct JNINativeInterface* JNIEnv;
#endif