Android Studio NDK及so文件开发

前言
什么是NDK?
NDK全称是Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk 。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so 。
为什么使用NDK?
1、代码的保护 。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大 。
2、可以方便地使用现存的开源库 。大部分现存的开源库都是用C/C++代码编写的 。
3、提高程序的执行效率 。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率 。
4、便于移植 。用C/C++写得库可以方便在其他的嵌入式平台上再次使用 。
什么是JNI?
JNI的全称是,它提供了若干的API实现了Java和其他语言的通信(主要是C和C++) 。
为什么使用JNI?
JNI的目的是使java方法能够调用c实现的一些函数 。
安卓中的so文件是什么?
中用到的so文件是一个c++的函数库 。在的JNI中,要先将相应的C语言打包成so库,然后导入到lib文件夹中供java调用 。
NDK及so文件开发
NDK安装及配置
NDK安装
从1.3 Beta1开始,支持了NDK 。之前则不支持,所以我们建议使用新版的编辑器 。
右键当前工程 => Open=>SDK
如果未安装,点击安装下载;
那么接下来配置环境变量;
配置环境变量
安装好的NDk一般位于你的sdk文件夹下的ndk- 。
比如我这里是:D:\SDK\ndk-(如下图),可以看到里面有ndk-build文件,下文进行编译的时候我们会用到 。
然后将该路径配置到你系统变量的path里面去,如下:
1、在系统环境变量里面创建
2、将追加到Path环境变量下-->;%%
添加完毕后打开cmd,输入ndk-build,出现如下内容则表示成功(网上说是成功的,虽然显示的貌似是一些错误信息,但是后文运行的时候是没问题的可以编译成功) 。
so库开发
新建“本地”方法
如下,在.java中建立了一个方法

Android Studio NDK及so文件开发

文章插图
();
【Android Studio NDK及so文件开发】可以看到这个方法的声明中有关键字,这个关键字表示这个方法是本地方法,也就是说这个方法()是通过本地代码(C/C++)实现的,在java代码中仅仅是声明 。
编译该类得到对应的.h文件
切换到,进入到该工程的java目录下(如下图所示),然后输入
javah -jni - utf-8包名.类名(如下图所示) 。
编译成功后,刷新下工程可以看到编译出的.h文件,该文件只是为了辅助我们写出相应的.c文件,使用完了即可删除 。
该文件的代码如下所示:
/* DO NOT EDIT THIS FILE - it is*/
#
/*for class*/
#
#
#ifdef
"C" {
#endif
/*
* Class:
* :
* : ()Ljava/lang/;
*/
( *, );
#ifdef
#endif
#endif
其实重要的部分就是这一句代码:
( *, );
仔细观察可以看到他是遵循“Java_包名类名本地方法名”来组织的(了解到这些后我们以后就可以不生成.h文件然后直接去写.c文件了) 。
编写.c文件
这时我们切换到,然后在app目录下新建jni文件夹,并在里面建立一个demo.c的c文件(如下图所示) 。
在demo.c文件中编写最基本的测试代码:
#
#
( *env, thiz) {
(*env)->(env, "I`m Str !");
这是就可以看出我们用的是.h中的那行代码,稍微修改为如上格式就是我们所需要的.c文件了 。