openSSL, использующий проблемы Android с NDK
У меня следующая ситуация: я портирую часть приложения, используя OpenSSL для шифрования AES, у меня все компилируется, но компоновщик не работает. Ситуация следующая: 1. Я написал оболочку JNI, которая просто делает:
private native String cipherString(String plainData, int datasize, String password, int passSize);
private native String decipherString(String cipheredData, int datasize, String password, int passSize);
затем у меня есть файл C++, который я вызываю и который имеет правильный синтаксис JNI, который переводит jstring в char * и все другие необходимые преобразования, а также вызывает другой файл cpp, который фактически импортирует заголовки openssl (присутствующие и учитываемые) и вызывает методы openssl для шифрования и дешифрования.
Поэтому, когда я вызываю ndk-build, он собирает все большие пальцы, поэтому компилятор правильно их компилирует. Затем мне нужно было портировать OpenSSL для Android, и я использовал этот OpenSSL для Android, который работает как char с простой ndk-сборкой (в корне проекта, конечно) и собирает libssl.so и libcrypto.so
Так что мне нужно соединить два.. Мне сложно подключить сценарии сборки, чтобы одна ndk-build все компилировала и связывала (я был бы признателен за простой пример проекта, если у кого-то есть на это время)
поэтому я скопировал скомпилированные файлы libssl и libcrypto.so в jni/includes/prebuilt и хочу включить их в проект, чтобы компоновщик смог наконец создать библиотеку, которую я буду использовать в конце.
У меня есть следующий файл Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/includes/build/common.mk
include $(LOCAL_PATH)/includes/build/common_includes.mk
APP_STL := gnustl_static
LOCAL_MODULE := packer
LOCAL_SRC_FILES := modules/cipher/wrapper.cpp \
... #rest of the cpp code
LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl
LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so \
$(LOCAL_PATH)/includes/precompiled/libcrypto.so
LOCAL_SHARED_MODULES := sslx cryptox
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sslx
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cryptox
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
И при вызове ndk-build я получаю разочарование
sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists or that its path is correct. Aborting . Stop.
как вы уже можете догадаться, путь совершенно неправильный, и меня смущает то, что ${LOCAL_PATH} возвращает правильный путь для первой партии включений и совершенно неправильный путь для файлов.so... Любая помощь будет очень признательна!
2 ответа
Вот решение, обновленное до NDK8c
Шаг ноль: скачать и исправить Android NDK Я не знаю, как, но у ndk есть очень интересный недостаток, который (по моему мнению) не позволяет вам скомпилировать множество вещей, поэтому чтобы иметь возможность скомпилировать OpenSSL, вам нужно сделать Небольшое исправление, извлеките ndk8c, где бы вы ни держали свои инструменты, и затем отредактируйте файл: android-ndk-r8c/build/gmsl/__gmsl строка 512: изменить строку
int_encode = $(__gmsl_tr1)$(wordlist 1,$1,$(__gmsl_input_int))
с линией
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))
И ты в порядке!
Шаг первый: Загрузите OpenSSL и скомпилируйте для Android: либо скомпилируйте портированную версию, найденную здесь, либо загрузите официальную версию OpenSSL 1.0.0c, а затем скомпилируйте ее для Android с помощью руководства, предоставленного в github, который я связал для версии, совместимой с Android
Поэтому следующий шаг - получить libssl.so и libcrypto.so и поместить их в папку NDK для быстрого доступа, поэтому скопируйте их из
openssl-folder/libs/armeabi/
в
android-ndk-r8c/platforms/android-8/arch-arm/usr/lib
таким образом, при компиляции вы можете включить библиотеки с помощью простого переключателя компоновщика -lssl -lcrypto
Шаг второй: получите последний источник Curl для здесь
Откройте файл в Docs/INSTALL и выполните шаги, необходимые для создания автономного набора инструментов, и поместите его в нужную папку, а затем сложную часть, мне нужно было иметь исходный код Android для продолжения конфигурации, даже если у меня есть автономная компилируемая В openssl вы также можете включить заголовочные файлы, в любом случае, это более сложная версия, поэтому вы выбираете, что вы делаете, я не решил уклоняться от них, чтобы вы могли перейти на сайт Google AOSP и выполнить шаги по созданию и инициализации. окружающая среда.
так что это будет что-то вроде:
1.download,
перейдите в корень исходного кода и запустите:
~: build / envsetup.sh; обед 1; делать;
Итак, наконец, нам нужно скомпилировать curl с поддержкой SSL, так что
Шаг третий
извлечь curl в нужную папку (у меня есть особое желание отключить все, кроме http/s, чтобы сохранить библиотеку как можно меньше, т.е. около ~300 КБ, если вам нужно больше протоколов в вашей библиотеке, удалите --disable-protocol для требуемый протокол) выполните следующее:
make clean
export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH
export LDFLAGS="\
-lssl \
-lcrypto \
-L/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/lib"
export CFLAGS="\
-I/home/user/Development/AOSP/2.3.7/system/core/include \
-I/home/user/Development/Tools/sdk/android/ndk/platforms/android-8/arch-arm/usr/include"
./configure --host=arm-linux-androideabi \
--with-ssl=/home/user/Development/Projects/portingLibs/openssl-android-master \
--disable-ftp \
--disable-gopher \
--disable-file \
--disable-imap \
--disable-ldap \
--disable-ldaps \
--disable-pop3 \
--disable-proxy \
--disable-rtsp \
--disable-smtp \
--disable-telnet \
--disable-tftp \
--without-gnutls \
--without-libidn \
--without-librtmp \
--disable-dict
make
Note that in the block above, if you don't want to use the AOSP source, you could switch
-I/home/user/Development/AOSP/2.3.7/system/core/include \
with the include folder for your ssl distribution.
Итак, наконец, у вас есть: static:
curl-7.28.1/lib/.libs/libcurl.a
и поделился:
curl-7.28.1/lib/.libs/libcurl.so.5.3
Вот и все... возьмите файл и скомпилируйте его:)
@Tancho
Я внес изменения в строку __gmsl:512, которую вы упомянули. Хотя он позволил OpenSSL скомпилировать, он также нарушает построение исполняемых файлов на $(BUILD_EXECUTABLE). Перед изменением мое простое приложение hello world компилируется и запускается, но после изменения оно компилируется, но его запуск на моем Nexus приводит к ошибке seg.
Отмените изменение, и все снова хорошо. Я не знаю, как это исправить, я на самом деле не знаю, что делает эта линия, но это всего лишь небольшое предупреждение любому, кто вносит это изменение.