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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:54:12