OpenSSL库链接错误求助:undefined reference问题排查
解决Android项目OpenSSL链接错误的方案
你的问题根源很明确:Android.mk配置错误地将OpenSSL的.so库文件放到了LOCAL_SRC_FILES变量中——这个变量是用来指定需要编译的源代码文件(比如.cpp、.c)的,不是用来声明链接依赖的外部库的,所以链接器找不到RSA_generate_key、AES_encrypt等函数的实现,才会抛出undefined reference错误。
下面是具体的修复步骤:
1. 修正Android.mk配置
把你的Android.mk替换成以下内容,关键是移除错误的库文件引用,改用正确的方式链接OpenSSL:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 你的模块名称 LOCAL_MODULE := myLibrary # 指定要编译的C++源文件 LOCAL_SRC_FILES := native-lib.cpp # 指定OpenSSL头文件的路径(确保这里指向你存放openssl头文件的include目录) LOCAL_C_INCLUDES := $(LOCAL_PATH)/include # 链接Android系统的log库(原配置正确,保留) LOCAL_LDLIBS := -llog # 声明依赖的OpenSSL共享库:这里只需要写库名(去掉前缀lib和后缀.so) LOCAL_SHARED_LIBRARIES := crypto ssl # 如果你的OpenSSL库不在NDK默认搜索路径中,需要额外指定库文件的路径(可选,根据你的目录结构调整) # LOCAL_LDFLAGS += -L$(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI) -lcrypto -lssl include $(BUILD_SHARED_LIBRARY)
2. 确认库文件的目录结构正确
你需要把libcrypto.so和libssl.so放到对应ABI的目录下,确保NDK能找到它们:
- 如果你用Android Studio:放到
app/src/main/jniLibs/[abi]/目录(比如armeabi-v7a、arm64-v8a、x86等,根据你的目标架构选择) - 如果你用ndk-build:放到
jni/libs/[abi]/目录
3. 额外检查点
- 确保你使用的OpenSSL库是针对Android平台编译的,不是桌面平台的版本,否则会出现链接或运行时兼容性问题
- 检查
openssl/rsa.h、openssl/aes.h头文件的版本和你的.so库版本一致,避免头文件与库实现不匹配的问题 - 你的
native-lib.cpp中JNI函数的extern "C"声明是正确的,这部分不需要修改
完成以上修改后,链接器就能正确找到OpenSSL库中的函数实现,解决undefined reference错误。
内容的提问来源于stack exchange,提问作者Gajanand Swamy
相关产品推荐
相关产品推荐

