从ndk-build迁移至CMake时遭遇build.ninja错误
从ndk-build迁移到CMake构建Android共享库
嘿,我来帮你把现有的Android.mk配置转换成对应的CMake配置,一步步来,保证你能顺利完成迁移~
第一步:创建CMakeLists.txt文件
在你的JNI代码目录(一般是app/src/main/cpp)下新建一个CMakeLists.txt,把下面的内容填进去,完全对应你原来的Android.mk逻辑:
# 设置CMake最低版本,根据你用的NDK版本调整,这里选个常用的3.10.2就行 cmake_minimum_required(VERSION 3.10.2) # 随便整个项目名,自定义就行 project(pitchYIN_build) # 构建你的共享库pitchYIN add_library( # 库名,和你Android.mk里的LOCAL_MODULE完全一致 pitchYIN # 类型选SHARED,对应ndk-build里的BUILD_SHARED_LIBRARY SHARED # 源文件列表,直接照搬你原来的LOCAL_SRC_FILES yin.c yinOld.c DSPAlgorithms.c singingEvaluation.c myutils.c ) # 要是你的代码依赖NDK里的系统库(比如log库用来打日志),可以加这段链接配置: # find_library( # log-lib # log # ) # target_link_libraries( # pitchYIN # ${log-lib} # )
第二步:在build.gradle里配置CMake
打开模块级的app/build.gradle,把原来ndk-build的配置替换成CMake的,找到android块,添加下面的内容:
android { // ... 你原来的其他配置(比如compileSdk、defaultConfig里的applicationId这些) defaultConfig { // ... 其他原有配置 externalNativeBuild { cmake { // 设置你要编译的ABI,和之前ndk-build的APP_ABI对应,比如armeabi-v7a、arm64-v8a abiFilters 'armeabi-v7a', 'arm64-v8a' // 要是需要传额外编译参数(比如定义宏、指定STL),可以加arguments,比如: // arguments "-DANDROID_STL=c++_shared" } } } externalNativeBuild { cmake { // 指定刚才创建的CMakeLists.txt的路径,别写错了 path "src/main/cpp/CMakeLists.txt" } } }
第三步:验证迁移结果
- 点击Android Studio右上角的「Sync Now」同步项目
- 构建项目,CMake会自动编译生成
libpitchYIN.so,你可以在app/build/intermediates/cmake/debug/obj/下对应ABI的目录里找到它
额外小提示
- 如果你的代码有自定义头文件目录,记得在CMakeLists.txt里用
include_directories()加上,比如头文件在cpp/include下,就加:include_directories(./include) - 要是原来的Android.mk里有
LOCAL_CFLAGS或LOCAL_LDFLAGS这类编译/链接参数,CMake里用target_compile_options()和target_link_options()来设置,比如:target_compile_options(pitchYIN PRIVATE -Wall -O2)
这样就搞定啦,CMake的配置比ndk-build更直观,也更适配现在Android Studio的构建流程~
内容的提问来源于stack exchange,提问作者Swapnil
相关产品推荐
相关产品推荐

