#Android Studio 中开发 JNI 的方法记录
https://www.jianshu.com/p/87ce6f565d37此系列文章不错,推荐
从网上看到基本上有两种发法:
-1、Cmake
-2、ndk-build
CMake
在新建android studio工程的时候勾选上支持c++后,在完成创建后,android studio会自动构建出cpp目录与Java同级;
其中的c/cpp文件即是默认的C层的native方法的实现;
我们可以看到Java文件中有load 库以及对本地方法的声明;
我们可以看到Java文件中有load 库以及对本地方法的声明;如果你需要添加自己的native方法,只需要在Java文件中进行声明后,AS会自动在cpp中生成对应的native函数,你只需要在cpp函数中实现你的函数功能就ok了;
如果要自己新增cpp文件,也想编译到lib库中,那么需要对CMakeLists.txt文件做些改动,把自己新增的文件路径添加到add_library中,如下图;当然也可以参考此修改,编译出自定义的新的.so库也是可以的。
这个是比较快捷和方便的。
如果想给之前的AS工程或者没有勾选C++支持的工程添加JNI支持,可以采用下面的ndk-build的方法;
##NDK-Build
此方法稍微复杂些,需要自己做一些配置,并且编写mk编译文件;
一般的流程是
1、在project->app->main下创建一个jni文件夹,在jin下创建include和src两个文件夹和Android.mk文件;
2、在Java类中声明需要调用的native方法,并且加载lib库;
.....
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("NdkBuildTest");
}
......
public native String getString();
}
3、Java类中声明好native方法后,需要使用javah命令便捷地生成jni层的头文件.h,然后在.c文件中实现.h文件中的方法;可以使用AS的终端命令窗口,进入到main路径下使用
javah -d jni/include -classpath java/xxx.java
在java10之后,javah去除了,可以使用如下命令生成头文件:
javac -h jni/inlcude java/xxx/xxx/xxx.java
即javac -h 目标路径 源java文件格式
会在include下生成.h文件;然后在src中添加.c文件实现.h文件中的函数;
4、编辑Android.mk文件,需要了解make编译语言,手动编辑编译命令;
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE :arm
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include \
$(LOCAL_PATH)/src \
$(JNI_H_INCLUDE)
LOCAL_SRC_FILES := src/com_example_myapplication_NdkBuildTest.c
LOCAL_MODULE := libNdkBuildTest
LOCAL_PRELINK_MODULE := false
LOCAL_LDFLAGS += -L$(LOCAL_PATH)
LOCAL_LDLIBS :=-llog
include $(BUILD_SHARED_LIBRARY)
5、配置build.gradle,需要将ndk-build配置到构建文件中;
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 19
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
}//这里我们声明我们需要编译出的so库支持的架构包
}
externalNativeBuild{
ndkBuild{
path "src/main/jni/Android.mk"
}//这里我们需要指明编译文件的路径
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
完成后,就可以重新构建工程,进行测试了。
这里有个关于make编译的网址,http://android.mk/ 可以有时间学习下编译原理及make编译语言的写法。
在源码中我们可以采用:
javac xxx.java -d bin/
javah -classpath bin com.xx.xx
生成头文件