Невозможно собрать внешнюю библиотеку OpenSSL для Android NDK в Windows / Cygwin - PullRequest
5 голосов
/ 30 января 2012

Мне нужно собрать последнюю версию OpenSSL (1.0.0g) для приложения Android. Я пытаюсь следовать примеру, приведенному https://github.com/fries/android-external-openssl,, но просто не могу его построить.

Я работаю под управлением Windows 7 Professional (64-разрядная версия) с полной версией Cygwin. Я установил Android SDK и NDK и могу успешно собрать и запустить пример приложения NDK hello-jni.

Я создал новый пример приложения NDK под названием hello-openssl. В его каталоге 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

Затем я изменил файл Android.mk в каталоге jni , пытаясь включить файлы 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,, который говорит мне «добавить JNI и JNI / включают в вышеупомянутые LOCAL_C_INCLUDES "в crypto / Android.mk, но я не могу понять синтаксис, который я должен использовать для достижения этой цели.

Я также не могу понять, у меня правильная структура каталогов.

Я искренне ценю любую помощь, которая может быть предложена.

Спасибо!

1 Ответ

12 голосов
/ 01 февраля 2012

Я решил эту проблему, отказавшись от 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»), вы получите библиотеки OpenSSL, включенные в систему Android, а не ваши пользовательские библиотеки.

Для этого просто выполните поиск по полному слову и замените ("libssl" -> "libsslx" и "libcrypto" -> "libcryptox") в каждом Android.mk (то есть в / crypto, / ssl и /apps).

Затем в вашем Android-приложении вызовите SystemLoadLibrary ("cryptox") и System.LoadLibrary ("sslx")

...