一、创建新工程

打开c++支持

配置NDK路径

需要主要的是,Cmake需要r12版本以上的NDK支持

二、gradle 配置

1、在defaultConfig中添加externalNativeBuild配置编译参数
2、在android中添加externalNativeBuild配置CMakeLists.txt路径

android{
...
defaultConfig{
...
externalNativeBuild {
cmake {
//
cFlags "-D__STDC_FORMAT_MACROS"
cppFlags "-std=c++11 -frtti -fexceptions"
// Arm neon的target,gcc的编译链,更多参数https://developer.android.com/ndk/guides/cmake
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=gcc"
}
}
nkd {
abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
}
....
}


externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}

三、编写源码

在java中编写JNI方法


public class MainActivity extends AppCompatActivity {
.....
public native String stringFromJNI();
...
}

创建C文件

src\main\app\下创建一个名为native-lib.cpp的文件

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring

JNICALL
Java_arialyy_com_cmaketest_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewString(hello.c_str());
}

配置CmakeList文件

注意:如果CmakeList文件有修改,必须clean 工程,AS才会同步脚本

cmake_minimum_required(VERSION 3.4.1)

# 添加第三方库或cpp源文件
# 使用 add_library() 向您的 CMake 构建脚本添加源文件或库时,Android Studio 还会在您同步项目后在 Project 视图下显示关联的标头文件。
# 不过,为了确保 CMake 可以在编译时定位您的标头文件,您需要将 include_directories() 命令添加到 CMake 构建脚本中并指定标头的路径:
add_library(aria-file-util SHARED src/main/cpp/aria-file-util.cpp)
add_library( # Sets the name of the library.
native-lib

# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )

# 添加 NDK API
# Android NDK 提供了一套实用的原生 API 和库。通过将 NDK 库包含到项目的 CMakeLists.txt 脚本文件中,您可以使用这些 API 中的任意一种。
# 预构建的 NDK 库已经存在于 Android 平台上,因此,您无需再构建或将其打包到 APK 中。
# 由于 NDK 库已经是 CMake 搜索路径的一部分,您甚至不需要在您的本地 NDK 安装中指定库的位置 -
# 只需要向 CMake 提供您希望使用的库的名称,并将其关联到您自己的原生库。
# 将 find_library() 命令添加到您的 CMake 构建脚本中以定位 NDK 库,并将其路径存储为一个变量。您可以使用此变量在构建脚本的其他部分引用 NDK 库。
# 以下示例可以定位 Android 特定的日志支持库并将其路径存储在 log-lib 中
find_library( # Sets the name of the path variable.
log-lib

# Specifies the name of the NDK library that
# you want CMake to locate.
log )

# 为了确保您的原生库可以在 log 库中调用函数,您需要使用 CMake 构建脚本中的 target_link_libraries() 命令关联库
target_link_libraries( # Specifies the target library.
native-lib

# Links the target library to the log library
# included in the NDK.
${log-lib} )

四、运行


使用CMake,不需要在linux下进行额外的编译操作,点击运行,AS会自动帮你编译so库,并自动创建apk文件

五、参考

NDK下载
CMake说明及构建
NDK 原生api