进入android这一行这么久,对android studio这个工具也是非常熟练了,但是就是还没去接触有关ndk的开发,有时候也浏览了一下相关的博客,但是却也是有点乱七八糟的,估计是我没认真去找那些写得好的博客。
这一次认真下来,有心弄一下ndk的开发,不求弄得很懂,但求可以简单调用就行了,经过多篇博客的认证与实验,终于在android studio上成功生成so包,并调用成功。所以接下来我将把此篇博客作为笔记记录下来,以便以后重新涉及的时候不会再犯迷糊。
在开始之前,我们要先做好一些预备工作,就是配置ndk的环境变量,先下载ndk,打开android studio的sdk设置,然后下载ndk,下载后默认是在sdk目录下面,如下图
然后新增环境变量NDK-ROOT,把ndk的目录配置一下
,如图所示
然后在path变量当中增加ndk变量的配置
因为我是win10的关系,所以新增%NDK-ROOT%的时候,不需要前面带分号(;),这点自己注意哈,配置好了之后,执行cmd打开命令提示符,执行ndk-build命令,如下图就是成功了
##完成以上操作后,接下来就是正式进入生成so文件的流程
首先我们先在android studio上创建一个普通的android项目,项目目录如下:
可以正常运行后,就在MainActivity中新增一个方法
public native String getStrFromJNI();
如图:
这个方法声明中有native关键字,这个关键字表示这个方法是本地方法,也就是说这个方法getStrFromJNI()是通过本地代码(C/C++)实现的,在java代码中仅仅是声明。
接下来是编译头文件(.h)的操作
在as底部的Terminal中,切换目录到java下,如下图所示,并输入命令 javah -jni -encoding utf-8 包名.类名(如下图所示)
编译成功后,刷新一下目录,会发现在java目录下会有一个.h文件,写过c/c++的人都知道,.h文件是为了给.c文件引用的,如图
看一下.h文件里面的内容是怎么样的,如图
其实重要的部分就是这一句代码:
JNIEXPORT jstring JNICALL Java_com_voctex_myndk_MainActivity_getStrFromJNI
(JNIEnv *, jobject);
仔细观察可以看到他是遵循“Java_包名类名本地方法名”来组织的(了解到这些后我们以后就可以不生成.h文件然后直接去写.c文件了)。
接下来是编译.c文件的操作
我们现在app目录下面新建一个jni的目录,如图
然后在jni目录下面新建.c文件,这里我们写了一个test.c文件,文件内容就是引用.h文件,并实现.h里面的方法,头文件(.h)里面的一般都是声明,.c文件是实现.h里面的东西,这里我们先把刚才生成的.h文件放到同一个目录下,这样好调用,如下图所示
.h和.c文件都有了,接下来就是生成so文件,以便给程序调用,这里我们要生成Android.mk文件,并做好配置信息(这里有个要注意的地方,待会会说明强调)
然后在底部的Terminal中,切换目录到app目录下,执行命令ndk-build编译生成so文件,如果在app下面的libs生成so包就说明成功了,obj目录也是生成的,但是没有什么卵用,可以直接忽视,当然你也可以删了,如下图:
成功生成so包后,接下来就是调用该so,在app下面的build.gradle文件里面增加配置,如下图
在MainActivity类里先加载该so包,然后就可以执行so包里面的方法了,如下图
直接运行,界面就会显示so里面定义好的字符串,如下图所示
到这里就算是成功了,自己编译生成so包,然后自己调用,这应该算是ndk开发的入门级了吧,哈哈哈哈。以后自己再接触的时候就不会再被坑了。