2012-04-23 4 views
3

У меня есть следующая ситуация: Я переношу часть приложения с использованием OpenSSL для шифрования AES, у меня есть все, что компилируется, но компоновщик терпит неудачу. Ситуация следующая: 1. Я написал обертку JNI, который просто делает:openSSL с использованием проблем NDK от Android

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 на символ * и все другие необходимы преобразований и делает вызов другому файлу cpp, который фактически импортирует заголовки openssl (присутствует и учитывается) и вызывает методы openssl для шифрования и расшифровки.

Поэтому, когда я вызываю ndk-build, он создает все большие пальцы, поэтому компилятор правильно их компилирует. следующий я должен был порт OpenSSL для андроид, и я использовал этот OpenSSL for Android , который работает как полукокс с помощью простого НДК-сборки (в корне проекта, конечно) и строит libssl.so и libcrypto.so

Так что мне нужно подключить два. Мне сложно подключить скрипты сборки, так что один ndk-build компилирует и связывает все (я бы оценил простой пример проекта, если у кого-то есть время для него)

поэтому я скопировал скомпилированные libssl и libcrypto .so файлы в jni/includes/prebuilt и хочу включить их в проект, чтобы компоновщик смог наконец создать lib, который я буду использовать в конце.

У меня есть следующий файл 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) 

И при вызове НДК-билд я получаю dissapointing

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-файлов ... Любая помощь была бы действительно оценена!

ответ

8

Вот решение, обновлен до NDK8c

шаг нулевой: скачать и исправить Android 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: либо скомпилировать портирована версия найдено here или Загрузить официальный 1.0.0с версия OpenSSL, а затем компилировать его для андроида, используя инструкцию, представленную в GitHub я связан для Android совместимой версии

Так что следующий шаг, чтобы получить libssl.so и libcrypto.so и поставить их в папке NDK для легкого доступа, поэтому скопировать их из

openssl-folder/libs/armeabi/ 

в

android-ndk-r8c/platforms/android-8/arch-arm/usr/lib 

этот путь при компиляции лет и может включать в себя эти библиотеки с помощью простого переключателя компоновщика -lssl -lcrypto

Шаг два: получить последний источник Curl для here

Откройте файл в Документах/INSTALL и следуйте инструкциям, необходимых, чтобы сделать автономный набор инструментов и положить в нужную папку, а затем сложную часть, мне нужно было, чтобы исходный код Android для продолжения конфигурации продолжался, хотя у меня есть автономный скомпилированный openssl, вы также можете включать в него файлы заголовков, в любом случае это сложнее чтобы вы выбрали то, что делаете, я не решил уклониться от них, чтобы вы могли перейти на Google AOSP site и пройти через шаги к bui ld и инициализировать среду.

так было бы что-то вроде:

1.Download,

  1. перейти в корень исходного кода и запуска:

    ~: строить/envsetup.sh; обед 1; делать;

Итак, наконец, мы должны скомпилировать локон с поддержкой SSL, поэтому,

Шаг три

экстракт завиток в нужную папку (у меня есть определенное желание отключить все, кроме HTTP/s, чтобы библиотека была как можно меньше значащей около ~ 300 тыс., если вы хотите, чтобы в вашей библиотеке было больше протоколов, удалите протокол -disable для требуемого протокола) выполните следующее:

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. 

Итак, наконец, у вас есть: статические:

curl-7.28.1/lib/.libs/libcurl.a 

и совместно:

curl-7.28.1/lib/.libs/libcurl.so.5.3 

Так вот оно .. взять файл и компилировать прочь :)

+0

Если она решается, вы можете пометить свое решение как ответ ... все лучшее –

+0

После применения исправления к __gsml я получаю ошибку: Android NDK: Ваш APP_BUILD_SCRIPT указывает на неизвестный файл: /Android.mk д : /Development/android/android-ndk-r8c/build/core/add-application.mk: 165: *** Android NDK: Отмена .... Стоп. На какой платформе вы запустили это? Окна? Возможно ли загрузить libcrypto.so libssl.so где-нибудь? – tmanthey

+0

вы можете показать нам, как вы связали все это в файле Android.mk? –

0

@Tancho

Я внес изменения в строку __gmsl: 512, о которой вы упомянули. Хотя он позволяет компилировать OpenSSL, он также разрушает построение исполняемых файлов на $ (BUILD_EXECUTABLE). Перед изменением мое простое приложение hello world компилируется и запускается, но после смены компиляции, но запуск его на моем Nexus приводит к ошибке seg.

Отменить изменение, и все снова хорошо. Я не знаю, как это исправить, я не знаю, что делает эта линия, но это всего лишь небольшое предупреждение для любого, кто внесет это изменение.

+0

Интересно .. У меня такое же изменение сделано. И все это хорошо работает до сих пор, но все же на стороне осторожности помогает ... – Tancho

+0

Я сделал это в конце, выполнив следующую подстановку: из 'int_encode = $ (__ gmsl_tr1) $ (wordlist 1, $ 1, $ (__gmsl_input_int)) 'to' int_encode = $ (__ gmsl_tr1) $ (wordlist 1, $ (if $ 1, $ 1,0), $ (__ gmsl_input_int)) 'Это прекрасно работает с $ 1 пустым, и в этом случае возвращается 0. – OwainD

Смежные вопросы