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 structureandroid jni 环境配置

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目录

android jni 环境配置android jni 环境配置

5、创建java文件,链接到jni文件的java文件

需要load编译库,声明native方法

6、创建jni头文件,可以使用命令行生成

android jni 环境配置

也可以手动写,需要注意的是库文件名格式 com_segway_robot_ndktest_MainActivity.h包名加类名

7、创建jni编译文件,可以是c/c++

8、创建Android.mk 与Application.mk文件。

android jni 环境配置android jni 环境配置

上图是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