最近在看Android增量更新的这块内容,发现需要用到Android JNI的这块知识,因此就简单的学习了一下。记录下学习的内容,以便以后再用到。
参考:http://blog.csdn.net/shulianghan/article/details/18964835#
1、环境搭建,无论做什么开发第一步肯定是搭建环境,这里也不例外
依据官方GUIDES,知道要下载三个部分文件,分别是:
NDK:一组工具让你能够在Android中使用C和C++代码
CMake:一个额外的构建工具和Gradle一起去建立你的native库。如果你只打算使用ndk-build,就不需要这个组建
LLDB:用于在Android Studio中调试native代码
具体的安装方法:
Android Studio中打开Tools->Android->SDK Manager(如图)
选中需要下载的内容,然后点击应用,等待安装完成
2、环境搭建完成,下面就来讲解一下如何建立第一个JNI程序
a.在你需要的地方写一个native方法(我是在MainActivity中定义了一个求和函数)
static {
System.loadLibrary("JniTest");//你调用的库
}
public native int getValue(int x, int y);
这时候你会发现getValue方法报错被画了红线(肯定的啊,库还没有,怎么会有这个方法呢),不过没关系,我们可以忽略这个错误
然后点击Bulid->Make Project,编译生成二进制文件(发现竟然没出错,看来上面的错误的确不影响),然后会在一下目录中找到编译后的文件
b.下一步就是生成JNI文件了
在AS 的控制台中执行命令javah,生成c语言头文件这里需要注意的是要进入 <Project>\app\src\main的目录下执行javah命令,为的是生成的 .h 文件同样是在<Project>\app\src\main路径下,可以在Studio的工程结构中直接看到。
C:\Users\Kira\Desktop\AndroidNDKFirst\app\src\main>javah -d jni -classpath E:\android\android_stdio_sdk\android_stdio_s
dk\platforms\android-19\android.jar;C:\Users\Kira\Desktop\AndroidNDKFirst\app\build\intermediates\classes\debug com.hdh
.androidndkfirst.MainActivity
执行一下,你会发现目录中多了一个文件夹和文件
这就是C语言的头文件
C.在jni目录中新建一个C文件(如下图)
打开main.c文件在里面实现头文件里面的方法,如下图,jni中的jint值类型对应于java中的int类型
D.修改build.gradle文件
在该文件中的defaultConfig的添加
ndk {
moduleName "JniTest"##这个名称就是将要生成的库文件的名称
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
然后在点击Build->Make Project发现竟然报错了
哈哈,不要怕,这个问题很简单,错误日志里都告诉我们怎么改了。打开gradle.properties,在里面添加
android.useDeprecatedNdk=true
然后再Make Project一下,OK了,一切都是那么的顺利,哈哈,然后我们将如下图一样看到生成的库文件
到这里基本也算成功了,然后我们回到MainActivity文件里发现getValue方法不报错了
public native int getValue(int x, int y);
最后见证奇迹的时候到了,我们在MainActivity将getValue方法的结果以日志的形式输出
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("hdh", getValue(1, 2) + "==========");
}
你会看到,哈哈
至此,一个简单的JNI程序就这么很自然的完成了,是不是觉得很简单。不过这只是最初级的,想要深入的理解还要不断学习。