AndroidStudio-NDK初探

话说 AndroidStudio从面世以来就一直被质疑能不能用这玩意开发NDK哪,从1.3以后貌似就支持的差不多了,现在都2.2了我才用他来玩NDK, 真是惭愧啊,鼓捣了一下午,看了几篇博客,想到了高中生物课本的一句话,”一猪生九仔,连母十个样啊!!”既然AndroidStudio已经这么人性化了,看了几个决定自己点点看,但是一些地方还是要谢谢那几篇博客啦!

ndk 环境配置搭建

配置ndk 到我们的环境变量中去,和当初我们配置adb是一样的,打开我们的.bash_profile文件(Windows 请自行Google),把我们的 ndk 路径放进去,话说现在AndroidStudio已经很完美的支持ndk了,ndk的下载可以像下载sdk那样下载了,下载完你的目录会多出一个ndk-bundle目录,那就是我们需要关心并把他的路径放到bash_profile文件中去的.使其bash_profile文件生效,并在终端输入ndk-build,如果有信息输出并不是error级别的那就证明 ok 了.

新建 ndk 项目

我们用 AndroidStudio(2.1.2) 新建我们的 ndk 项目,和 Android 项目一样,这里我打算用 ndk写一个求和的 demo,MainActivity就是一个 TextView 显示我们的求和结果,没有说的,然后我们新建一个 Java 类,用来实现native方法

1
2
3
4
5
6
7
public class NDKTest{
public static native int add(int a,int b){
static{
System.loadLibary("NDKDEMO");
}
}
}

这里暂时用到这两个文件,如何才能发挥他们的威力,下面会讲.那么这里面有这么一行System.loadLibrary("NDKDEMO");,那我们就要开始配置我们的 ndk 到项目使其生效,首先打开local.properties这个文件,把 ndk 的路径像 sdk 那样配置进去,然后在gradle.properties这个文件尾加上android.useDeprecatedNdk=true,最后在 app gradle 文件中加上

1
2
3
ndk{
moudleName "NDKDEMO"
}

看出来了吧,上面的System.loadLibrary其实就是这地方的moduleName,同步我们的工程,应该不会报错!

jni 的两种生成姿势

AndroidStudio的智能体现

我们在 MyNDK 中定义了一个 native 方法,但是他报红了,我们使用 AndroidStudio 的智能提示, alt+enter, 看到第一个选项就是

然后我们看到 main 下面多出了一个 jni 目录,下面多出了和moduleName一样的文件,打开我们可以看到

1
2
3
4
5
#include <jni.h>
JNIEXPORT jint JNICALL
Java_ndktst_android_com_ndkdemo_NDKTest_add(JNIEnv *env,jclass type,jint a,jint b)&#123;
return a+b;
&#125;

形式就是包名+ native类名+方法名,这样就OK, 我们把 a+b 返回,然后我们在 MainActivity 中

1
2
NDKTest myNdk = new NDKTest();
textView.setText(myNdk.add(1,1)+"");

这样 TextView 中显示2,成功.

最装逼也是最常用的姿势

这一种是我们最常用的姿势,在 AndroidStudio 中打开终端,定位到我们的 Java 目录,输入javah -jni packageName+className去我们的 jni 目录看见生成了一个很长的.h 文件,以本例为例,生成了一个这东西ndktst_android_com_ndkdemo_NDKTest.h,一般不在这个文件中进行操作,会在复制一个文件,命名为.cpp的文件,

1
2
3
4
5
6
#include "ndktst_android_com_ndkdemo_MyNDK.h"
#include "Add.h"
jint Java_ndktst_android_com_ndkdemo_NDKTest_add(JNIEnv *env,jclass jclassl,jint jint1,jint jint2)&#123;
Add add;
return add.addFromClass(jint1.jint2);
&#125;

然后我们新建一个C++类,自动生成. h 和. cpp的文件,.h 文件中我们这样写

1
2
3
4
5
6
7
#ifndef NDKDEMO_ADD_H
#define NDKDEMO_ADD_H
class Add&&#123;
public:
int addFromClass(int a,int b);
&#125;
#endif //NDKDEMO_ADD_H

.cpp 这样写

1
2
3
4
#include "Add.h"
int Add::addFromClass(int a,int b)&#123;
return a+b;
&#125;

上面那个很长的. cpp 文件应该找到解释了吧,我们只不过是把加法运算的方法重新定义了类,在那里面调用.最后运行的结果是一样的!!!

大功告成

这里我们只是传递了 int 类型的,那么我们在实际开发中用到的不止 int 类型,可能我们要传一个对象等等啊,就完全不一样了,我们要去看官方文档,有点复杂,这篇文章只是和大家一起在 AndroidStudio 上面先把 ndk 玩转而已!!!真实开发中用到的时候再来填坑吧!!!!
一个好朋友献上的,😄😄

NDK 指南
developers.google.ndk

版权声明:



除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

坚持原创技术分享,您的支持将鼓励我继续创作!