You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在NDK中为不同库同时使用ndk-build与CMake的配置问题

混合使用ndk-build与CMake集成外部原生库的解决方案

我太懂这种新旧构建系统混着用的头疼了——原来的库用ndk-build跑的好好的,突然要加个只支持CMake的外部库,确实容易卡壳。下面给你两种可行的解决思路,你可以根据自己的场景选:

思路1:将现有ndk-build项目迁移到CMake(推荐长期维护)

如果你的项目后续还会有更多原生依赖,统一用CMake管理会更省心,步骤如下:

  • 转换构建配置:把原来src/main/jni/下的Android.mk和Application.mk里的逻辑转写成CMakeLists.txt。比如:
    • 原来LOCAL_SRC_FILES里的源文件,对应CMake的add_library的源文件列表;
    • LOCAL_CFLAGS/LOCAL_CPPFLAGS对应target_compile_options;
    • LOCAL_LDLIBS对应target_link_libraries里的系统库。
  • 修改Gradle配置:把Library的build.gradle里的externalNativeBuild改成CMake配置:
    externalNativeBuild {
        cmake {
            path 'src/main/jni/CMakeLists.txt'
        }
    }
    
  • 集成外部CMake库:按照外部库提供的指引,在你的CMakeLists.txt里用add_subdirectory(如果把外部库源码放到项目里)或者find_package(如果是预编译库)来引入,然后通过target_link_libraries把你的库和外部库链接起来。

思路2:保留ndk-build,手动集成预编译的外部库

如果不想折腾迁移,可以先把外部CMake库编译成.so文件,再集成到现有ndk-build项目中:

  • 编译外部库:按照外部库的CMake指引,编译出对应ABI的静态库(.a)或共享库(.so),注意要和你现有项目支持的ABI一致(比如armeabi-v7a、arm64-v8a等)。
  • 放置库文件:把编译好的.so放到Library的src/main/jniLibs/[abi]/目录下(比如src/main/jniLibs/arm64-v8a/libexternal.so),头文件放到src/main/jni/include/或者你指定的目录。
  • 修改Android.mk:在原来的Android.mk里添加头文件路径和链接配置:
    # 添加外部库的头文件路径
    LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
    # 如果是共享库,添加到LOCAL_SHARED_LIBRARIES
    LOCAL_SHARED_LIBRARIES += external
    # 如果是静态库,添加到LOCAL_STATIC_LIBRARIES
    # LOCAL_STATIC_LIBRARIES += external
    # 或者直接链接库文件
    LOCAL_LDFLAGS += -L$(LOCAL_PATH)/../jniLibs/$(TARGET_ARCH_ABI) -lexternal
    
  • 统一ABI配置:在Library的build.gradle里指定ABI过滤器,确保和外部库编译的ABI一致:
    android {
        defaultConfig {
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
    

常见坑点提醒

  • ABI不匹配:这是最常见的问题,如果你的项目和外部库的ABI不一致,运行时会抛出UnsatisfiedLinkError,一定要确保两边的ABI列表完全一致。
  • 头文件路径错误:编译时如果报“找不到xxx.h”,检查LOCAL_C_INCLUDES(ndk-build)或者include_directories(CMake)是否正确指向了外部库的头文件目录。
  • 链接顺序问题:静态库链接时,依赖的库要放在被依赖的库后面,不然会出现未定义符号的错误。

内容的提问来源于stack exchange,提问作者Swapnil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:44