android jni 环境配置
一、jni定义
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是c/c++)。
二、jni编译工具
jni使用ndk编译,作者使用android studio集成并编译。
1、从谷歌官网下载ndk,作者使用的是android-ndk-r10e
2、配置android studio环境file->project structure
3、在对用module下编写build.gradle
在defaultConfig下添加
ndk {
abiFilters "x86_64" "armeabi-v7a" "armeabi"//表示动态库运行环境
}
在buildType添加
sourceSet{
main {
jni.srcDirs=[]
}
}
这部分可以参考https://developer.android.com/studio/projects/add-native-code.html#download-ndk
在android目录下加task
task ndkBuild(type: Exec) { commandLine NDKCommand(), 'NDK_PROJECT_PATH=build', 'APP_BUILD_SCRIPT=src/main/jni/Android.mk', 'NDK_APPLICATION_MK=src/main/jni/Application.mk', 'NDK_APP_LIBS_OUT=src/main/libs' } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn ndkBuild } externalNativeBuild { ndkBuild { path 'src/main/jni/Android.mk' } }在最外层目录添加如下两个方法用户获取ndk环境
def GetNDKDir() { def localProperties = new Properties() def NDK_SEARCH_VARS = ['ANDROID_NDK_HOME', 'ANDROID_NDK_ROOT', 'NDKROOT', 'NDKHOME'] def ndk_path = null def lim = (Os.isFamily(Os.FAMILY_WINDOWS)) ? '\\' : '/' // Search Local.Properties file try { localProperties.load(project.rootProject.file('local.properties').newDataInputStream()) def ndkDir = localProperties.getProperty('ndk.dir') ndk_path = ndkDir != null ? ndkDir + lim : null; } catch (java.io.FileNotFoundException e) { println 'local.properties file not found' } // Search env var if (ndk_path == null) { for (String var : NDK_SEARCH_VARS) { def v = System.getenv(var) if (v != null) { ndk_path = v + lim println "found in System Environment *$var = " + ndk_path break } } } else { println 'found in local.properties *NDK_PATH = ' + ndk_path } if (ndk_path == null) { println 'No NDK_PATH found' ndk_path = '' } return ndk_path } def NDKCommand() { if (Os.isFamily(Os.FAMILY_WINDOWS)) { return GetNDKDir() + "ndk-build.cmd" } else { return GetNDKDir() + "ndk-build" } }以上ndk环境即创建完毕
4、新建jni目录,右键点击main目录
5、创建java文件,链接到jni文件的java文件
需要load编译库,声明native方法
6、创建jni头文件,可以使用命令行生成
也可以手动写,需要注意的是库文件名格式 com_segway_robot_ndktest_MainActivity.h包名加类名
7、创建jni编译文件,可以是c/c++
8、创建Android.mk 与Application.mk文件。
上图是Android.mk文件格式,libthermal.so是编译依赖库,LOCAL_MODULE是指定编译库文件名,LOCAL_LDFLAGS指定编译静态依赖库,LOCAL_SHARED_LIBRARIES指定编译动态库,LOCAL_SRC_FILES指定本次编译文件。
Application.mk指定编译平台 APP_ABI:=x86_64,到这里编译环境准备结束。
请参考:https://developer.android.com/ndk/guides/android_mk.html#over