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

Mar*_*hio 5 android openssl android-ndk

我需要为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
Run Code Online (Sandbox Code Playgroud)

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

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

include $(subdirs)
Run Code Online (Sandbox Code Playgroud)

现在,当我执行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
Run Code Online (Sandbox Code Playgroud)

我找到了http://osdir.com/ml/android-ndk/2010-07/msg00424.html,它告诉我在crypto/Android.mk中"添加jni和jni/include到上面的LOCAL_C_INCLUDES",但我可以找出我应该用来实现这个的语法.

我也无法弄清楚我有正确的目录结构.

我真诚地感谢任何可以提供的帮助.

谢谢!

Mar*_*hio 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" - >"libsslx"和"libcrypto" - >"libcryptox")(即在/ crypto,/ ssl和/中)应用).

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