1.官网

  https://developer.android.com/studio/projects/add-native-code.html

2.android studio 安装相关工具

  1. 在打开的项目中,从菜单栏选择 Tools > Android > SDK Manager
  2. 点击 SDK Tools 标签。
  3. 选中 LLDBCMake 和 NDK 旁的复选框,如图所示.

    

3.新建支持c/c++的项目

  1. 在android studio 3.4.1 新建向导里选 Native C++ 模板.

2.选择想要使用的c++标准,如C++14.

3.最后 生成的项目如下:

其中:

    • CMakeLists.txt 是cmake构建工程要用的项目配置文件,类似android.mk.
    • native-lib.cpp是源文件

4.编辑代码,使用本地程序....

4.在现有项目中添加 c/c++库

4.1 创建 jni目录

  项目名(或者File) ---> 右键 --->  New ---> Folder ---> JNI Folder

4.2 创建 CMakeLists.txt文件

  在上一步上创建的jni目录(当前版本目录名是cpp) 右键 ---> New ---> File 输入CMakeLists.txt

4.3 配置CMakeLists.txt 文件

 # Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build. cmake_minimum_required(VERSION 3.4.1) # Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK. add_library( # Specifies the name of the library.
# 本地库名
student-lib # Sets the library as a shared library.
# 本地库的类型
SHARED # Provides a relative path to your source file(s).
# 要编译的源文件 ,多个之间用空格.
student.cpp school.cpp) # Specifies a path to native header files.
include_directories(inc) #添加本地代码依赖的其它系统库.
find_library( # Defines the name of the path variable that stores the
# location of the NDK library.
log-lib # Specifies the name of the NDK library that
# CMake needs to locate.
log ) # Links your native library against one or more other native libraries.
target_link_libraries( # Specifies the target library.
student-lib # Links the log library to the target library.
${log-lib} )
  • 注意CMakeLists.txt中源文件和include的路径引用问题,这里是和源文件同级.
  • CMakeLists.txt 常用函数含义
  • 下面是常用的cmake命令.

    cmake命令官网 : https://cmake.org/cmake/help/latest/manual/cmake-commands.7.html 

add_library()

向您的 CMake 构建脚本添加源文件或库

 add_library( # Specifies 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 )

include_directories

指定头文件的路径

 add_library(...)

 # Specifies a path to native header files.
include_directories(src/main/cpp/include/)
find_library()

添加引用的NDK 库

 find_library( # Defines the name of the path variable that stores the
# location of the NDK library.
log-lib # Specifies the name of the NDK library that
# CMake needs to locate.
log )
target_link_libraries()

链接多个库

 target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
 add_library()

将其它源代码编译到本地库中.

 add_library( app-glue
STATIC
${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c ) # You need to link static libraries against your shared native library.
target_link_libraries( native-lib app-glue ${log-lib} )

set_target_properties

和 IMPORTED

IMPORTED不是个函数,只是add_library的参数,添加其他预构建的本地库

然后,您需要使用 set_target_properties() 命令指定库的路径.

4.4 关联Gradle与 CMakeLists.txt  

  右键点击您想要关联的模块(例如 app 模块),并从菜单中选择 Link C++ Project with Gradle。关联到之前创建的CMakeLists.txt,点OK.

  

4.5 完成本地的c/c++代码工作

MainActivity.java 

 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();
}

native-lib.cpp

 #include <jni.h>
#include <string> extern "C" JNIEXPORT jstring JNICALL
Java_com_example_cpp14_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

  

5.在 Gradle 中使用 CMake 变量

  https://developer.android.com/ndk/guides/cmake.html#variables

 android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild { // For ndk-build, instead use ndkBuild {}
cmake { // Passes optional arguments to CMake.
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" // Sets optional flags for the C compiler.
cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2" // Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-D__STDC_FORMAT_MACROS"
}
}
} buildTypes {...} ...
}

6.指定本地库的cpu架构

  默认情况下,Gradle 会针对 NDK 支持的 ABI 将您的原生库构建到单独的 .so 文件中,并将其全部打包到您的 APK 中。如果您希望 Gradle 仅构建和打包原生库的特定 ABI 配置,您可以在模块级 build.gradle 文件中使用 ndk.abiFilters 标志指定这些配置.

 apply plugin: 'com.android.application'

 android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.tocpp5"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use ndkBuild {}
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_ARM_NEON=TRUE", "-DANDROID_TOOLCHAIN=clang" // Sets optional flags for the C compiler.
cFlags "-D_EXAMPLE_C_FLAG1", "-D_EXAMPLE_C_FLAG2" // Sets a flag to enable format macro constants for the C++ compiler.
cppFlags "-D__STDC_FORMAT_MACROS" abiFilters 'armeabi-v7a','arm64-v8a' }
}
30 ndk {
31 // Specifies the ABI configurations of your native
32 // libraries Gradle should build and package with your APK.
33 abiFilters 'x86', 'x86_64', 'armeabi-v7a','arm64-v8a'
34 }
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
cmake {
path file('src/main/jni/CMakeLists.txt')
}
}
} dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

  在 defaultConfig.externalNativeBuild.cmake {} 

  或

  defaultConfig.externalNativeBuild.ndkBuild {} 块

  中配置另一个 abiFilters 标志。Gradle 会构建defaultConfig.ndk中的 ABI 配置,不过仅会打包在 defaultConfig.cmake或者ndkBuild{} 块中指定的配置。

NDK(23) 使用CMake 构建 c/c++代码库的更多相关文章

  1. 构建自己的代码库在Code-Google上

    多年工作的代码,有不少可以抽象出来作为工具类的.如果每次都把项目的工具类存放到U盘.必然会造成维护的问题.主要是你不可能天天的带u盘 去代码里复制粘贴.去code.google.com建立自己的代码库 ...

  2. CMake 构建项目教程-简介

    CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...

  3. 在 linux 下使用 CMake 构建应用程序

    学习cmake http://xwz.me/wiki/doku.php?id=cmake 碰到的一些问题: 1.You have changed variables that require your ...

  4. 【经验分享】win10 cmake 构建 Tengine 工程

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   本教程详细记录了在 win10 环境中 ...

  5. Jenkins+PMD构建自动化静态代码检测

    前言:软件缺陷是不可避免的,要尽量减少错误并提高软件质量,主要有两在类技术,即缺陷预防和缺陷检测 缺陷预防包括编写更好的设计规范.实施代码审核制度.运行代码静态分析工具.运行单元测试等 PMD是一种开 ...

  6. mac book pro macOS10.13.3安装qt、qt creator C++开发环境,qt5.11.1,并解决cmake构建:qt mac this file is not part of any project the code

    因为之前在Ubuntu下使用的是qtcreator开发,现在想在mac上装一个系统,因为许久未装了,还是花了点时间,不如写个博客,下次就更快安装了.在Mac OS X下使用Qt开发,需要配置Qt库和编 ...

  7. AndroidStudio2.2 Preview3中NDK开发之CMake和传统 JNI在目录结构和配置文件上的区别(转载)

    自从AndroidStudio更新到2.2,就有了CMake和传统JNI两种开发NDK的方法,主要就是在目录结构和build.gradle上的区别,下面我们将分别介绍目录区别和build.gradle ...

  8. 在linux下使用CMake构建应用程序

    本文介绍了一个跨平台的自动化构建系统 CMake 在 linux 上的使用方法. CMake 是一个比 automake 更加容易使用的工具,能够使程序员从复杂的编译连接过程中解脱出来.文中通过一些例 ...

  9. 在 linux 下使用 CMake 构建应用程序【转】

    本文转载自:https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html CMake 简介 CMake 是一个跨平台的自动化建构系 ...

随机推荐

  1. 用MapReduce实现关系的自然连接

  2. JS流程控制语句 来来回回(Do...while循环) 先执行后判断 do while结构的基本原理和while结构是基本相同的,但是它保证循环体至少被执行一次。

    来来回回(Do...while循环) do while结构的基本原理和while结构是基本相同的,但是它保证循环体至少被执行一次.因为它是先执行代码,后判断条件,如果条件为真,继续循环. do...w ...

  3. vue初学之node.js安装、cnpm安装、vue初体验

    1. 如果本机没有安装node运行环境,请下载node 安装包进行安装.地址:https://nodejs.org/en/ 2.装完,使用cmd命令行输入:node -v回车 如果输出版本号则成功. ...

  4. 纯CSS样式写刘海屏效果

    1. 效果: 2. 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  5. React弹窗组件

    原文地址 小寒的博客 这里的弹窗泛指所有的弹出组件,这些组件不受页面其他UI布局影响,处于DOM结构的顶层,绝对定位在body元素下. 这个特殊性也给它的开发提出了特殊的要求. react新版本中的c ...

  6. java中自己对页面跳转问题的一些经验

    在eclipse中,如果你要在jsp页面跳转到servlet页面中,可以用action=“/根文件名/servlet文件名” 的方式跳转. 例如我创建了一个web application名字是test ...

  7. jeecms v9 vue环境搭建

    一.安装NODEJS运行环境 前往nodejs官网下载nodejs,https://nodejs.org/en/ ,建议下载最新稳定版的,下载后安装即可,下载选择类似如下 安装完毕之后,在cmd中输入 ...

  8. java基础之DateFormat类

    DateFormat DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateFor ...

  9. python内置类型详细解释

    文章编写借鉴于内置类型 - Python 3.7.3 文档,主要用于自己学习和记录 python主要内置类型包括数字.序列.映射.类.实例和异常 有些多项集类是可变的.它们用于添加.移除或重排其成员的 ...

  10. 嘴巴题5 「BZOJ1864」[ZJOI2006] 三色二叉树

    1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1195 Solved: 882 [Submit][Status ...