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
相关产品推荐
相关产品推荐

