传统地,在Android Studio上为Java程序添加JNI本地代码的方法主要是:
在build.gradle(Module: app)中的defaultConfig添加:
ndk {
moduleName "native-lib"//so库名
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
在gradle.properties中添加:
android.useDeprecatedNdk=true
随着Android Studio的不断更新,该方法似乎已经失效。android.useDeprecatedNdk=true产生提示使用:android.deprecatedNdkCompileLease=1524619220074,又产生错误“Process 'command ……' finished with non-zero exit value 2”。网上教程又说在build.gradle(Module: app)的android{}中添加:
sourceSets.main {
jni.srcDirs = []}
但这又导致无法生成库文件。各种曲折方法都试过,现在直接呈上最新解决方案。
1. 新建类JNI.java,声明native方法;
public class JNI {
static {
System.loadLibrary("native-lib);//加载so库,实现native方法
}
public static native String sayHello();//声明native方法
}
2. 使用android studio终端编译JNI.java,生成JNI.class;
javac JNI.java
3. 在类包名的上一级使用javah生成.h头文件;javah -jni com.example.xxx.xxx.JNI
4. 在app/src/main下建立jni文件夹,新建native-lib.cpp并实现上一步生成的头文件中的函数;
5. 在build.gradle(Module: app)的defaultConfig{}中添加:
externalNativeBuild {
cmake {
cppFlags ""
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
7. 在app\下新建CMakeLists.txt文件,并添加如下内容:
cmake_minimum_required(VERSION 3.4.1)
add_library(
native-lib#库名
SHARED
src/main/jni/native-lib.cpp )#本地文件路径
find_library(
log-lib
log )
target_link_libraries( 、native-lib#库名
${log-lib} )
8. rebuild后在app\build\intermediates\cmake\debug\obj下生成.so库