一、创建新工程
打开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 ) { 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