一、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++层的开发。