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

Android项目加载两类预构建.so库:CMake/Android.mk配置及选型咨询

集成两个Native项目的构建脚本方案 & 工具对比

我来帮你搞定这个跨构建系统的项目集成问题,下面分别给出CMake和Android.mk的整合方案,再聊聊哪个工具用起来更顺手。

一、推荐方案:使用CMake构建

现在Android Studio官方更推崇CMake,它对多ABI管理、预编译库依赖的支持更清晰,调试和集成体验也更好。把两个项目的逻辑整合到一个CMakeLists.txt里就行:

cmake_minimum_required(VERSION 3.4.1)

# --------------------------
# 1. 处理第一个项目:native-lib + 预编译OpenSSL
# --------------------------
add_library(native-lib SHARED
        src/main/cpp/native-lib.cpp) # 替换成你的native-lib.cpp实际路径

# 导入预编译的OpenSSL动态库(注意每个ABI下都要有对应so文件)
add_library(openssl-crypto SHARED IMPORTED)
set_target_properties(openssl-crypto PROPERTIES
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libcrypto.so)

add_library(openssl-ssl SHARED IMPORTED)
set_target_properties(openssl-ssl PROPERTIES
        IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libssl.so)

# 引入OpenSSL的头文件路径(替换成你的实际头文件目录)
include_directories(${PROJECT_SOURCE_DIR}/openssl-include/)

# --------------------------
# 2. 处理第二个项目:把Android.mk的serial_port转成CMake构建
# --------------------------
add_library(serial_port SHARED
        src/main/cpp/SerialPort.c) # 替换成你的SerialPort.c实际路径

# 链接系统log库给串口模块
find_library(log-lib log)
target_link_libraries(serial_port ${log-lib})

# --------------------------
# 3. 最终链接:把所有依赖库关联到native-lib(可根据你的实际依赖调整)
# --------------------------
target_link_libraries(native-lib
        openssl-crypto
        openssl-ssl
        serial_port
        ${log-lib})

注意事项:

  • 确保src/main/jniLibs下每个你需要支持的ABI目录(比如armeabi-v7a、arm64-v8a)都有对应的libcrypto.so和libssl.so。
  • 调整openssl-include、native-lib.cpp、SerialPort.c的路径为你项目中的实际位置。

二、备选方案:使用Android.mk构建

如果你更习惯Makefile风格的脚本,也可以把两个项目的逻辑合并到一个Android.mk中,搭配Application.mk使用:

Android.mk

LOCAL_PATH := $(call my-dir)

# --------------------------
# 1. 导入预编译的OpenSSL库
# --------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := openssl-crypto
LOCAL_SRC_FILES := jniLibs/$(TARGET_ARCH_ABI)/libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := openssl-ssl
LOCAL_SRC_FILES := jniLibs/$(TARGET_ARCH_ABI)/libssl.so
include $(PREBUILT_SHARED_LIBRARY)

# --------------------------
# 2. 构建第一个项目的native-lib
# --------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := src/main/cpp/native-lib.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/openssl-include/ # OpenSSL头文件路径
LOCAL_SHARED_LIBRARIES := openssl-crypto openssl-ssl
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

# --------------------------
# 3. 构建第二个项目的serial_port
# --------------------------
include $(CLEAR_VARS)
LOCAL_MODULE := serial_port
LOCAL_SRC_FILES := src/main/cpp/SerialPort.c
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

Application.mk(可选,指定支持的ABI和平台)

APP_ABI := armeabi-v7a arm64-v8a # 按需指定支持的ABI,不要写all避免冗余
APP_PLATFORM := android-21 # 建议选Android 5.0及以上,兼容更多设备

三、CMake vs Android.mk:哪个更易用?

毫无疑问CMake更适合新手和现代Android开发,原因如下:

  • 语法更直观:CMake的逻辑更接近高级语言,依赖管理、库导入的写法比Makefile风格的Android.mk更容易理解,不容易写错。
  • IDE支持更好:Android Studio对CMake的集成度更高,比如可以直接在IDE里调试native代码、查看构建日志,构建速度也更快。
  • 生态更完善:官方文档、社区教程、问题解决方案都是优先围绕CMake更新的,遇到问题更容易找到答案。
  • 扩展性强:CMake支持跨平台构建,如果你以后需要把项目移植到其他平台(比如Linux、Windows),几乎不用改脚本。

而Android.mk属于较老旧的构建系统,语法繁琐,对新手不友好,官方现在也很少更新它的特性,除非你维护的是老项目,否则不建议用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:07:49