首先先来认识:NDK 和 JNI介绍
JNI (Java Native Interface)是一套编程接口,用来实现java代码和其他语言(c、C++或汇编)进行交互。这里需要注意的是JNI是JAVA语言自己的特性,也就是说JNI和Android没有关系。在Windows下面用JAVA做开发也经常会用到JNI,例如:读写系统注册表等。
NDK(Native Development Kit)是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so。
一、下载配置ndk开发环境。
file-->setting-->Appearance & Behavior-->System Settings-->Android SDK-->SDK Tools,选中CMake、LLDB、NDK,Apply-OK。
二、Android studio配置NDK路径。
file-->Project Sturcture-->SDK Location-->Android NDK location: 直接点击下边的按钮,自动添加-->OK。
三、配置环境变量。
将上面的NDK路径,复制下来,配置到系统Path上。类似SDK那样。
四、开始写demo,新建myserialport项目,在gradle.properties添加一行,
android.useDeprecatedNdk=true
并在java下新建android_serialport_api目录。新建SerialPort类。
public class SerialPort{
public static native String helloJni();
public static native int addCalc(int a, int b);
//加载SO文件
static {
System.loadLibrary("SerialPort"); // 注意没有前缀lib和后缀.so
}
}
这之后会报错,不要管,build一下。
五、在Terminal栏,cd 到app\build\intermediates\classes\debug,然后用执行命令
javah -classpath android.jar的绝对路径;. -jni android_serialport_api.SerialPort 回车,
生成c/c++头文件android_serialport_api_SerialPort.h。
六、在main下新建jni文件夹,并将生成的android_serialport_api_SerialPort.h文件移动到此。
七、jni下新建android_serialport_api_SerialPort.cpp文件,
#include <android_serialport_api_SerialPort.h>
JNIEXPORT jstring JNICALL Java_android_serialport_api_SerialPort_helloJni
(JNIEnv *env, jclass jobj) {
return (*env)->NewStringUTF(env,"SerialPort JNI!");
}
JNIEXPORT jint JNICALL Java_android_serialport_api_SerialPort_addCalc
(JNIEnv *env, jclass jobj, jint ja, jint jb) {
return ja + jb;
}
八、修改gradle 配置,
android {
...
defaultConfig {
...
sourceSets{
main{
jniLibs.srcDirs=["libs"]
}
}
ndk{
moduleName "SerialPort"
abiFilters "arm64-v8a", "armeabi-v7a", "x86", "x86_64"
ldLibs "android","log","EGL"
}
}
九、测试。
SerialPort port=new SerialPort();
tv_result.setText(port.helloJni());
tv_result1.setText(port.addCalc(13,24)+"");
到此为止,以下是生成so文件并使用导入so文件。
十、生成.so文件,jni下新建Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := SerialPort
LOCAL_C_INCLUDES := ${LOCAL_PATH}
LOCAL_SRC_FILES := SerialPort.cpp
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
十一、除了jniLibs下面的so文件移动到app/libs,obj、jni、jniLibs全删掉。重新运行。