CMake 安卓NDK编译常用语法

CMake 安卓NDK编译常用语法

CMake版本

cmake_minimum_required(VERSION 3.5)

设置项目名称

project(my_project_name)

  • 设置之后使用${PROJECT_NAME}就可以得到项目名称

###常用的内置变量

  • PROJECT_NAME
    • 返回通过 PROJECT 定义的项目名称
  • CMAKE_C_FLAGS
    • 编译 C 文件时的选项,默认为空
  • CMAKE_CXX_FLAGS
    • 编译 C++ 文件时的选项,默认为空
  • CMAKE_SHARED_LINKER_FLAGS
    • 链接动态库时的选项,默认为空
  • PROJECT_SOURCE_DIR
    • 工程的根目录,同CMAKE_SOURCE_DIR
  • CMAKE_CXX_COMPILER_ID
    • 获取当前编译器ID,大部分是ClangGNUIntelMSVC的其中一种
  • ANDROID_ABI
    • 当前编译的安卓ABI类型,是armeabi-v7aarmeabi-v7a with NEONarm64-v8a的其中一种

平台 32&64

if("${ANDROID_ABI}" STREQUAL "armeabi-v7a" OR "${ANDROID_ABI}" STREQUAL "armeabi-v7a with NEON")
    set(ANDROID_STL "gnustl_shared")
    set(ANDROID_TOOLCHAIN "gcc")
    set(STRIP_PATH "arm-linux-androideabi")
    message("current ABI is: ${ANDROID_ABI}")
elseif ("${ANDROID_ABI}" STREQUAL "arm64-v8a")
    set(ANDROID_STL "c++_shared")
    set(ANDROID_TOOLCHAIN "clang")
    set(STRIP_PATH "aarch64-linux-android")
    message("current ABI is: ${ANDROID_ABI}")
else()
    message(FATAL_ERROR "${ANDROID_ABI} is no support")
endif()

路径相关配置

# 设置cmake编译库输出的位置
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})

# 设置头文件搜索路径
include_directories(
	...
)

# 设置需要编译的源文件
file(
	GLOB SOURCE_FILES
	...
)

# 设置库文件搜索路径
link_directories(
	...
)

设置生成动态库文件

add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})

常用的编译和链接选项

编译选项
CMAKE_CCXX_FLAGS_RELEASECMAKE_CCXX_FLAGS_RELEASE
  • -fno-rtti
    • 禁用运行时类型信息
  • -fno-exceptions
    • 禁用异常机制
  • -fPIC
    • 生成与位置无关代码
  • -O3
    • 编译优化选项,常加到CMAKE_C/CXX_FLAGS_RELEASE
  • -ffunction-sections -fdata-sections
    • 可以减少库体积的优化选项
  • -std=c++11
    • 使用c++11标准库,如果代码中有用到的话,加到CMAKE_CXX_FLAGS
链接选项
CMAKE_SHARED_LINKER_FLAGS
  • -Wl,-Bsymbolic
    • 优先使用库内符号,避免加载的时候使用了程序中其他同名静态变量
  • -Wl,--gc-sections
    • 未使用的代码不会被链接,减少库体积
  • -dead-strip
    • 删除未使用的符号,减少库体积

链接第三方库

# 设置需要链接的库文件
target_link_libraries(${PROJECT_NAME}
	...
  • 常用的安卓库
    • android: jni库
    • log: 打印日志
    • jnigraphics: 安卓图片库
    • EGL: OpenGL相关
    • GLESv: OpenGLES2.0相关

导出有符号和无符号库

add_custom_command(TARGET ${PROJECT_NAME}
	POST_BUILD
	COMMAND cp ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libmbccore.so ${PROJECT_SOURCE_DIR}/obj/${ANDROID_ABI}/
	COMMAND ${ANDROID_NDK_PATH}/toolchains/${STRIP_PATH}-4.9/prebuilt/darwin-x86_64/bin/${STRIP_PATH}-strip --strip-all ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libmbccore.so
	COMMAND ditto 其他第三方.so库 ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}
)
  • 注意这里的${ANDROID_NDK_PATH}需要通过外部指定进来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用CMake编译NDK需要以下步骤: 1. 下载并装Android Studio。 2. NDK。在Android Studio中,打开SDK Manager,然后在SDK Platforms选项卡下找到NDK,勾选并装。 3. 在你的Android项目中创建一个CMakeLists.txt文件,该文件定义了CMake编译时的构建配置。例如,以下是一个简单的CMakeLists.txt文件: ``` cmake_minimum_required(VERSION 3.4.1) add_library(mylib SHARED src/main/cpp/mylib.cpp) ``` 这个CMakeLists.txt文件指定了我们要构建一个名为mylib的共享库,该库由src/main/cpp/mylib.cpp文件编译而成。 4. 在你的Android项目中创建一个build.gradle文件,并在文件中定义CMake构建配置。例如,以下是一个简单的build.gradle文件: ``` android { compileSdkVersion 26 defaultConfig { applicationId "com.example.myapplication" minSdkVersion 21 targetSdkVersion 26 versionCode 1 versionName "1.0" externalNativeBuild { cmake { cppFlags "-std=c++11" arguments "-DANDROID_PLATFORM=android-21" } } } externalNativeBuild { cmake { path "CMakeLists.txt" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } ``` 这个build.gradle文件定义了我们的应用程序的构建配置,并指定了CMake构建配置所需的一些参数。 5. 配置Android Studio以使用CMake构建你的应用程序。在Android Studio的菜单栏中选择File > Project Structure,然后在左侧面板中选择"app"。然后在右侧面板中选择"Build Types"选项卡,选择"ndkBuild"或者"cmake",并指定你的CMakeLists.txt文件的路径。 6. 点击"Sync Project with Gradle Files"按钮,这将下载并同步所需的库和依赖项。 7. 现在你可以构建和运行你的应用程序,Android Studio将自动使用CMake编译你的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值