无法在Windows / Cygwin上为Android NDK构建外部OpenSSL库

时间:2012-01-30 14:31:04

标签: android android-ndk openssl

我需要为Android应用程序构建最新的OpenSSL(1.0.0g)。我试图按照https://github.com/fries/android-external-openssl给出的示例,但我无法建立它。

我正在使用完整且最新的Cygwin运行Windows 7 Professional(64位)。我已经安装了Android SDK和NDK,我可以成功构建并运行NDK的hello-jni示例应用程序。

我创建了一个名为hello-openssl的新示例NDK应用程序。在 jni 目录中,我创建了一个 openssl 目录。在那里,我解压缩https://github.com/fries/android-external-openssl/zipball/master,它给了我这个树结构在c:\ android \ android-ndk \ samples \ hello-openssl:

jni
+- openssl
   +- apps
   +- crypto
   +- include
      +- openssl
   +- ssl

然后我修改了 jni 目录中的 Android.mk 文件,试图包含OpenSSL文件:

subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
    openssl \
))

include $(subdirs)

现在当我执行ndk-build时,它会编译几个.c文件,但很快就会失败:

Compile thumb  : crypto <= cryptlib.c
In file included from jni/openssl/crypto/cryptlib.c:117:
jni/openssl/crypto/cryptlib.h:65:18: error: e_os.h: No such file or directory
jni/openssl/crypto/cryptlib.h:72:28: error: openssl/crypto.h: No such file or directory

我找到http://osdir.com/ml/android-ndk/2010-07/msg00424.html,它告诉我&#34;添加 jni和jni / include到上面的LOCAL_C_INCLUDES&#34;在crypto / Android.mk中,但我无法弄清楚我应该用来实现这个目的的语法。

我也无法弄清楚我是否有正确的目录结构。

我真诚地感谢所提供的任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:12)

我通过放弃https://github.com/fries/android-external-openssl而不是使用https://github.com/guardianproject/openssl-android解决了这个问题。

它基于更新的OpenSSL(1.0.0a),它在NDK中构建而没有任何修改。

请注意,要在Android应用中使用这些库,您必须重命名它们。如果您只是在应用程序中包含生成的libssl.so和libcrypto.so,然后调用System.LoadLibrary(“crypto”)和System.LoadLibrary(“ssl”),您将获得Android系统中包含的OpenSSL库,而不是你的自定义库。

要做到这一点,只需在每个Android.mk中进行全字搜索并替换(“libssl” - &gt;“libsslx”和“libcrypto” - &gt;“libcryptox”)(即在/ crypto中, / ssl和/ apps)。

然后在您的Android应用中,调用SystemLoadLibrary(“cryptox”)和System.LoadLibrary(“sslx”)