因为书中和网上搜到的方法都有些过时了,这里简单记录一下使用Android Studio进行NDK编程的过程。
1. 在SDK Manager中安装NDK工具
打开SDK Manager - SDK Tools,选中NDK,Apply,即开始安装NDK工具。
2. 定义native方法
2.1 生成.h头文件
2.1.1 新建空工程,并在MainActivity同级目录下新建java类JniTest.java。
2.1.2 Build - Make Project,生成class文件;在我的Android Studio版本,这个文件在\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes文件夹中,跟网上的文章不同。
2.1.3 打开Terminal,进入main文件夹下。
2.1.4 在Terminal中键入javah -d jni -classpath …\…\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes top.littlefogcat.chapter14_jni_ndk.JniTest
此时,main目录下已经生成了jni文件夹,其中就有所需要的.h头文件。
2.2. 新建test.c
在jni目录下新建test.c文件如下:
#include <jni.h>
#include <stdio.h>
#include "top_littlefogcat_chapter14_jni_ndk_JniTest.h"
JNIEXPORT jstring JNICALL Java_top_littlefogcat_chapter14_1jni_1ndk_JniTest_get
(JNIEnv *env, jclass cls){
return (*env) -> NewStringUTF(env, "Hello JNI");
}
在这个文件中定义了native方法需要做的事,这里简单返回了一个字符串"Hello JNI"。
至此,native方法已经定义完毕。
3. 新建.mk文件
在jni文件夹下,新建两个.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
APP_ABI := all
4. 生成so库
在Terminal中输入ndk-build,即可生成.so文件。生成的.so文件在main\libs下。注意在这里需要把ndk所在的目录添加到系统的环境变量中。
将生成的文件名修改为libjni_test.so,这个名字可以自定义。
5. 调用native方法
在调用native方法之前,要先使用System.loadLibrary("jni_test");
来加载.so文件,一般使用static块来进行加载。这里的jni_test即是第5步中去掉头上的lib和最后的.so剩下的部分。
public class JniTest {
static {
System.loadLibrary("jni_test");
}
public native static String get();
}
然后,在需要使用的地方调用JniTest.get()即可。
TextView tv = findViewById(R.id.tv);
tv.setText(JniTest.get());