进入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开发的入门级了吧,哈哈哈哈。以后自己再接触的时候就不会再被坑了。

更多相关文章

  1. Android(安卓)启动服务配合AsyncTask 使用OKHttp 实现断点下载大
  2. OPhone/Android的学习(2)—从分析Eclipse自动生成的代码到以XML
  3. 基于Android的英文电子词典
  4. 安全篇 - 隐式配置 KeyStore 签名信息
  5. Android(安卓)Camera生成bmp格式的图片
  6. 一个关于android游戏下载静默安装功能的思路以及实现
  7. 在Android(安卓)studio里面使用AIDL
  8. android apk包反编译、破解心得
  9. Android(安卓)Paging分页库的学习(二)—— 结合Room数据库进行分页

随机推荐

  1. Android(安卓)C2DM学习——云端推送
  2. Android使用AsyncTask实现可以断点续传的
  3. android资源自适应的认识(一)
  4. Android(安卓)ListView 最基本的用法,使
  5. Android菜单Menu的简单使用
  6. android-Activity读书笔记
  7. android activity 左右滑动
  8. Android(安卓)API Levels 详解
  9. 关于Android中ANR的一些思考
  10. Android大图加载优化--基于LRU算法的本地