标签:
1、NDK的概念
NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk;
集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so;
可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作;
使用NDK的好处:
使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率 ;
需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的;
交叉编译:一个平台生成另一个平台上执行的代码;比如x86编译称arm平台可运行程序;
JNI:语言中转的接口;
链接库:静态链接库和动态链接库,把C代码编译称so库,静态的是相关依赖资源整合到一个文件中,好处是方便;
动态链接库体积小,但会出现相关资源找不到的问题;
mk文件:C文件的编译脚本文件
NDK目录结构;ndk-build 对mk配置的c文件进行编译;
ndk-stack 调试代码的命令,可编译log文件,从而可以定位到代码;
platform 支持的版本
toolchains 交叉编译的工具
2、NDK开发包
推荐使用r9d的这个历史版本,稳定。
下载旧版本的NDK,google没有直接提供链接。可以通过下面的链接下载旧版本的NDK: https://dl.google.com/android/ndk/android-ndk-<version>-<platform>.<fileextension>
其中<version>为NDK的版本,如r7/r7b/r7c/r8/r8b等内容,
<platform>为目标操作系统,可以为:windows/darwin-x86/linux-x86,分别对应于:Windows,Mac OS X (intel),Linux 32/64-bit (x86)平台,<fileextension>为文件后缀,
如果<platform>为windows,则为"zip",否则为"tar.bz2"。
解压NDK,D:\Android\android-ndk-r9d 到环境变量中去。
Eclipse里:确认下插件
4、生成SO等文件
可以导入一个NDK的sample,复制项目路径,打开命令行。
项目里会多出:
此时F5刷新后可以直接在模拟器中显示结果。
由于我们只生成arm的so文件即可。
clean之后把项目里面JNI文件夹下Applicatio.mk注释掉,并删除obj文件夹。重新clean后再build,这样编译速度就快了。只生产了ARM的so.
4、开发NDK
1、创建android项目;
2、创建Jni目录;
3、编写java的native方法;
4、生成JNI头文件:
a、编写javaNative代码;
在工程的java文件夹中编写;
eg: publicstaticnativeString getStringFromC();
b、命令javah:通过jave文件生成头文件的命令。
classes后面分号指定android.jar的路径。这时在jni目录多了com_example_hindk_MainActivity.h jni头文件的签名。这样就可以查找到java方法对应的native的哪些方法;
创建一个C文件,实现native的方法:先把之前头文件里面的方法复制过来,重新写下方法;
同一级目录下创建个mk文件(项目的编译文件),可以从官方sample里面拷贝过来进行修改;
android.mk文件中LOCAL_MODULE指定JNI编译的SO叫什么名字, LOCAL_SRC_FILES是需要编译的C文件。
build项目:到项目路径下ndk-build
c、添加android.jar包到环境变量;
这是上一步的需要指定android.jar的路径;
5、生成so文件的调用;
java文件中可以使用静态代码块。
static{
System.loadLibrary("hi");
}
privateTextView textView;
publicstaticnativeString getStringFromC();
@Override
protectedvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView =(TextView)findViewById(R.id.text);
textView.setText(getStringFromC());
}
5、Eclipse下NDK环境
这样设置就无需使用ndk-build的命令行了;
打印log:
#include<android/log.h>
#define TAG "NativeMedia"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
LOGV("EOS was processed\n");
并在mk文件里面配置下,代表log库引入当前项目中
# for logging
LOCAL_LDLIBS +=-llog
6、JNI交互:Eclipse开发工具配置
配置生成javah选项:生成C++头文件;
注意空格;点击对应java文件,执行;
配置Eclipse添加native支持jni方法提示;
Android Tools—>Add Native Support
项目右键—>Properties—>C++ General—>Path and Symbols—>Add—>NDK的platforms的里面一个Arm里面的Include
C文件中使用:Ctrl + Alt
配置生成javap选项:打印java方法的方法签名,为了查找对应方法;
NDK开发
标签:
原文地址:http://www.cnblogs.com/fruitbolgs/p/5659812.html