JNI开发入门

Posted by Haiden on April 5, 2019

一、NDK配置(Mac)

1.1 下载

在Android studio中,选择Sdk Manager → android sdk → sdk tools → 选择NDK → 确定下载。

ndk 路径可直接在 File — Project structure 中选择SDK location,复制 ndk 安装路径,如图:

1.2 添加路径配置

在终端输入修改.bash_profile文件:

1
vim ~/.bash_profile 

在 .bash_profile 配置文件增加以下配置:

1
export PATH=${PATH}:/Users/haiden/Library/Android/sdk/ndk-bundle (ndk安装目录)

在终端输入以下命令使修改生效:

1
source .bash_profile

在终端输入 ndk-build 命令,验证配置是否成功。

二、ndk-build 编译生成.so文件

2.1 编辑gradle.properties

在最外层工程目录下的gradle.properties的文件末尾加上android.useDeprecatedNdk=true

2.2 编写交互代码

1、新建java类

新建java类,加载so文件,调用native方法。

1
2
3
4
5
6
7
8
9
public class JNIUtils {

    // 加载native-jni
    static {
        System.loadLibrary("native-jni");
    }
    //java调用native声明且方法名
    public native String stringFromJNI();
}

2、生成class类文件

重新Make Project,完成后会在工程目录生成编译后的classes文件。

3、生成头文件

1
2
3
4
5
6
7
1)在Android studio的Terminal命令行中先进入到工程的main目录下。

2) 输入命令:
	jdk-10.0.2以下的版本
		javah -d jni -classpath 自己编译后的class文件的绝对路径。
	jdk-10.0.2以上的版本
		javac java文件路径 -h h文件输出路径ß

4、 新建c 文件

在jni目录下新建一个 native-lib.c 的 c 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
//
// Created by Haiden on 2019/4/1.
//

#include "com_nothing_jnitest1_JNIUtils.h"

/**
 * 上边的引用标签一定是.h的文件名家后缀,方法名一定要和.h文件中的方法名称一样
 */
JNIEXPORT jstring JNICALL Java_com_nothing_jnitest1_JNIUtils_stringFromJNI
        (JNIEnv *env, jobject ojb){
    return (*env) -> NewStringUTF(env,"Hello, I'm from jni");
}

2.3 构建so文件(CMAKE方式)

1、 编辑 app 下的 buidle.gradle 文件,添加使用cmake的命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
    compileSdkVersion 27
    buildToolsVersion("27.0.3")
    defaultConfig {
				...

        // 使用Cmake工具
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }
    .......
}

2、创建CMakeLists.txt 文件

在项目\app目录下创建CMakeLists.txt 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#cmake最小版本
cmake_minimum_required(VERSION 3.4.1)

add_library( # 设置so文件名称.
             native-jni
             # 设置这个so文件为共享.
             SHARED
             # 设置 c文件源码位置.
             src/main/jni/native-jni.c )

find_library( # Sets the name of the path variable.
              log-lib
              log )

target_link_libraries( # 制定目标库.
                       native-jni
                       ${log-lib} )

在app 下的 buidle.gradle 文件的android节点下,添加cmake命令

3、编译运行项目

编译运行项目,查看是否调用成功。

2.4 指定so输出路径

CMake 指定so输出路径,在CMakeLists.txt文件中添加:

1
2
3
#设置生成的so动态库最后输出的路径
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})

三、新建项目

3.1 新建项目

新建项目包含c++支持。

项目创建完,生成cpp目录,可以在cpp目录下进行c++层的开发。