为Android armeabi-v7a编译BoringSSL后链接libcrypto.so遇格式错误
解决BoringSSL库链接错误:File in wrong format
1. 验证库的架构与目标ABI一致性
先确认编译生成的libcrypto.so确实是armeabi-v7a架构:
# 在终端执行该命令检查库架构 file /path/to/your/libcrypto.so
正常输出应包含ARM, EABI5 version 1 (SYSV)或armv7l相关标识。如果输出是x86/x86_64或arm64说明编译参数未生效,需重新执行BoringSSL编译命令,确保ANDROID_ABI=armeabi-v7a参数正确,且ANDROID_NDK_ROOT指向的NDK版本与Android项目使用的NDK完全一致。
2. 修正项目库路径结构
Android第三方库需按ABI分类存放,正确路径结构应为:
app/opensslSO/libs/ └── armeabi-v7a/ ├── libcrypto.so ├── libssl.so ├── libpki.so └── libdecrepit.so
同时修改CMakeLists.txt,根据当前编译ABI自动匹配库路径:
cmake_minimum_required(VERSION 3.18.1) set(OPENSSL_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/opensslSO/include") # 按当前编译ABI动态获取库路径 set(OPENSSL_LIBRARY_DIR "${CMAKE_SOURCE_DIR}/opensslSO/libs/${ANDROID_ABI}") include_directories(${OPENSSL_INCLUDE_DIR}) add_library(crypto SHARED IMPORTED) set_target_properties(crypto PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBRARY_DIR}/libcrypto.so IMPORTED_ABI ${ANDROID_ABI} # 明确指定库ABI,避免混淆 ) add_library(ssl SHARED IMPORTED) set_target_properties(ssl PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBRARY_DIR}/libssl.so IMPORTED_ABI ${ANDROID_ABI} ) add_library(pki SHARED IMPORTED) set_target_properties(pki PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBRARY_DIR}/libpki.so IMPORTED_ABI ${ANDROID_ABI} ) add_library(decrepit SHARED IMPORTED) set_target_properties(decrepit PROPERTIES IMPORTED_LOCATION ${OPENSSL_LIBRARY_DIR}/libdecrepit.so IMPORTED_ABI ${ANDROID_ABI} ) # 注意:add_library的目标名需与target_link_libraries的目标名一致 add_library(score_printer SHARED my_native_file_path ) target_link_libraries(score_printer crypto ssl pki decrepit android log EGL GLESv1_CM )
3. 配置项目ABI过滤规则
在app模块的build.gradle中明确指定仅编译armeabi-v7a架构,避免编译其他ABI时出现链接错误:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a' } } }
4. 确保NDK版本完全兼容
编译BoringSSL使用的NDK版本必须与Android项目依赖的NDK版本完全一致:
- 查看项目build.gradle中的
ndkVersion配置 - 重新编译BoringSSL时,确保
${ANDROID_NDK_ROOT}指向该版本的NDK路径
内容的提问来源于stack exchange,提问作者Jungwon
相关产品推荐
相关产品推荐

