什么是CMake
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。
CMake的使用
如果还没有下载CMake,可以在Studio中进行下载安装
1、如果你的项目已经在开发阶段,则需要配置CMake环境。
2、如果你的项目还没有创建,则可以在最初创建项目时候选择CMake模式的项目,会自动配置CMake相关的信息。
第一种情况:我们需要自己构建CMake环境,首先是编写CMakeLists.txt,代码如下
#有关在Android Studio中使用CMake的更多信息,请阅读
#文档:https://d.android.com/studio/projects/add-native-code.html
#设置构建本机库所需的CMake的最小版本。
cmake_minimum_required(VERSION 3.4.1)
#创建并命名一个库,将其设置为静态或共享,并提供到其源代码的相对路径。
#您可以定义多个库,CMake为您构建它们。
# Gradle自动将共享库打包到APK中。
add_library( # 设置库的名称.
native-lib
# 将库设置为共享库.
SHARED
# 提供到源文件的相对路径.
native-lib.cpp)
#搜索指定的预构建库并将路径存储为变量。因为CMake在搜索路径by中包含了系统库默认情况下,
#您只需要指定公共NDK库的名称CMake验证库之前是否存在完成构建。
find_library( # 设置path变量的名称.
log-lib
# 指定要CMake定位的NDK库的名称。
log)
#指定库CMake应该链接到目标库。您可以链接多个库,例如在此构建脚本中定义的库、预构建的第三方库或系统库。
target_link_libraries( # 指定目标库.
native-lib
# 将目标库链接到包含在NDK中的日志库
${log-lib})
代码都有注释,接下来在app/buildgradle中配置CMakeLists.text的位置,如图所示:
可以手动填写,或者通过Studio的功能,
然后填入CMakeLists.txt的目录位置,点击确定就可以在app/buildgradle中生成CMake的环境。
接着测试CMake环境,写一个native-lib.cpp。并在Mainactivity中调用
native-lib.cpp的代码
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_dingxingxiang_myapplication_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
MainActivity代码
package com.dingxingxiang.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = findViewById(R.id.sample_text);
tv.setText(stringFromJNI());
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native String stringFromJNI();
}
编译运行就可以生成一个.externalNativeBuild文件夹
第二种情况:新建项目的时候,选择配置CMake模式,如下如顺序
点击“finish"按钮之后,会生成配置好的CMake环境,如下如:
。