【问题标题】:How to integrate openssl to Android?如何将openssl集成到Android?
【发布时间】:2013-09-22 06:33:01
【问题描述】:

我想使用 openssl 的 RSA,所以我需要用 ndk 将 openssl 集成到 Android。我在 https://github.com/aluvalasuman/OpenSSL1.0.1cForAndroid 下载了适用于 Android 的 openssl 源。 ndk-build在源文件夹中生成libcrypto.solibssl.so,我将它们复制到$(MY_PROJECT)/jni/lib/,然后将它们链接到Android.mk中:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LIBS := $(LOCAL_PATH)/lib
LOCAL_STATIC_LIBRARIES := libcrypto libssl
LOCAL_LDLIBS := -llog
LOCAL_MODULE := jni

LOCAL_SRC_FILES := jni.c

include $(BUILD_SHARED_LIBRARY)

并像这样测试了openssl:

#include <stdio.h>
#include <string.h>

#include <openssl/rsa.h>

#define nr_bits 2048

int test_openssl()
{
  RSA *rsa = RSA_generate_key(nr_bits, 65537, NULL, NULL);
  return 0;
}

当我编译它时,它抛出了错误:

....jni/license/license.c:10: error: undefined reference to 'RSA_generate_key'
collect2: ld returned 1 exit status

有谁知道问题出在哪里?如果有人能提供帮助,我将不胜感激。

【问题讨论】:

    标签: android c linux openssl


    【解决方案1】:

    此类undefined reference 错误通常表明编译器/链接器未在其路径中找到 libcrypto.so。你可以尝试几件事:

    1. 将 -lcrypto 添加到 LOCAL_LDLIBS。这告诉编译器尽可能使用 libcrypto.so 来解析未定义的符号

    2. 将 $(MY_PROJECT)/jni/lib/ 添加到 LOCAL_LIBS,以便编译器知道从哪里选择 -lcrypto。这假设 $(MY_PROJECT) 在 make 文件中定义。

    【讨论】:

      【解决方案2】:

      我知道这是一个老问题,但如果有人遇到这个问题,她或他可以使用以下方法解决问题:

      LOCAL_STATIC_LIBRARIES := crypto
      

      而不是

      LOCAL_STATIC_LIBRARIES := libcrypto libssl
      

      【讨论】:

        猜你喜欢
        • 2012-09-20
        • 1970-01-01
        • 2017-01-31
        • 1970-01-01
        • 2012-02-18
        • 2017-06-24
        • 1970-01-01
        • 1970-01-01
        • 2015-04-29
        相关资源
        最近更新 更多