Добавление Cryptopp в Android.mk

Я попытался создать библиотеку cryptopp для Android. Я использовал эту часть руководства. https://www.cryptopp.com/wiki/Android_(Command_Line)

$ cat build-all-android.sh 
#!/bin/bash

for arch in armeabi armeabi-v7a armeabi-v7a-hard arm64-v8a mips mips64 x86 x86_64
do
    . ./setenv-android.sh $arch stlport
    if [ "$?" -eq "0" ]; then
        make -f GNUmakefile-cross distclean
        make -f GNUmakefile-cross static dynamic
        sudo make -f GNUmakefile-cross install PREFIX=/usr/local/cryptopp/android-$arch
    fi
done

Я был в состоянии сделать библиотеки. Моя проблема в том, что я не могу добавить его в свой проект. Кажется, мне нужно отредактировать файл Android.mk, но я не могу сделать это правильно. Я добавил этот блок в свой Anroid.mk

#########################################################
# STLport library
include $(CLEAR_VARS)

STLPORT_INCL     := /Applications/Cocos/Android/android-ndk-r10e/sources/cxx-stl/stlport
STLPORT_LIB      := /Applications/Cocos/Android/android-ndk-r10e/sources/cxx-stl/stlport/libs/$(TARGET_ARCH_ABI)

LOCAL_MODULE := stlport_shared
LOCAL_SRC_FILES := $(STLPORT_LIB)/libstlport_shared.so
LOCAL_CPP_FEATURES += rtti exceptions

LOCAL_EXPORT_CPPFLAGS :=
LOCAL_EXPORT_C_INCLUDES := $(STLPORT_INCL)

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := stlport_shared

#########################################################
# Crypto++ library
include $(CLEAR_VARS)

CRYPTOPP_INCL   := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/include
CRYPTOPP_LIB    := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/lib

LOCAL_MODULE       := cryptopp
LOCAL_SRC_FILES    := $(CRYPTOPP_LIB)/libcryptopp.so
LOCAL_CPP_FEATURES := rtti exceptions

LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp

include $(PREBUILT_SHARED_LIBRARY)

LOCAL_SHARED_LIBRARIES  := cryptopp

#########################################################

Я основал это на вики-странице Crypto++ Android Activity, которая ссылалась на AndroidPRNG, которая демонстрирует использование Crypto++ в качестве общего объекта на Android.

Я застрял, потому что я не могу заставить его работать. Я очень плохо знаком с Android, поэтому я точно не знаю, что с этим делать. Я смог заставить его работать на ios-версии. Я следовал учебнику по XCode. Именно это сводит меня с ума. Я был бы признателен за любую помощь, которую я могу получить. Что-то не так с тем, как я строю? После сборки я могу скопировать его в свой проект или просто установить ссылку на установленную версию? Как правильно добавить / связать его с моим проектом? Извините, что задали так много вопросов.

PS: я использую cocos2dx для своего проекта. Может быть, стоит упомянуть.

1 ответ

Решение

Прочитав и попробовав всевозможные комбинации для моего Android.mk, я смог скомпилировать cryptopp с помощью cocos2dx.

Во всяком случае, вот как я исправил ошибку компилятора:

ПЕРВЫЙ - Сборка библиотек

cat build-all-android.sh 
#!/bin/bash

for arch in armeabi armeabi-v7a armeabi-v7a-hard arm64-v8a mips mips64 x86 x86_64
do
    AOSP_PI="android-16" . ./setenv-android.sh $arch gnu-static
    if [ "$?" -eq "0" ]; then
        make -f GNUmakefile-cross distclean
        make -f GNUmakefile-cross static dynamic
        sudo make -f GNUmakefile-cross install PREFIX=/usr/local/cryptopp/android-$arch
    fi
done

Обратите внимание, что я использовал gnu-static -> это потому, что cocos2dx использует gnu-static.


ВТОРОЙ - Обновление Android.mk

# Crypto++ library
include $(CLEAR_VARS)

CRYPTOPP_INCL   := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/include
CRYPTOPP_LIB    := /usr/local/cryptopp/android-$(TARGET_ARCH_ABI)/lib
LOCAL_MODULE       := cryptopp
LOCAL_SRC_FILES    := $(CRYPTOPP_LIB)/libcryptopp.a
LOCAL_CPP_FEATURES := rtti exceptions
LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_SHARED_LIBRARIES  := cryptopp



---------------------------------------- ДЛЯ WINDOWS ----------------------------------------

Ответ выше работает только для Mac. В Windows я попытался установить библиотеки cryptopp, но мне это не удалось. AOSP_TOOLCHAIN_PATH был недействительным. Я попытался исправить это, обновив setenv-android.sh, добавив в него "windows-x86_64". Я смог исправить эту часть, но, к сожалению, у меня была ошибка "make: not a command". Мне сказали, что я должен был загрузить это для своего cygwin.

Я сейчас скачиваю это. Я буду обновлять этот ответ, когда смогу установить команды make и sudo на мою Windows.

В то же время, вот что я сделал, чтобы сделать мой проект с использованием cryptopp compile в Windows, предполагая, что вы успешно скомпилировали его в mac:
1.) Скопируйте библиотеки cryptopp android и заголовочные файлы из /usr/local/cryptopp в вашу папку jni. Это должно выглядеть примерно так: иерархия папок для cryptopp

Примечание: в /usr/local/cryptopp включаемые файлы находятся в определенной папке Android. В приведенном выше примере я разместил включаемый файл снаружи, поскольку все они используют одинаковые заголовочные файлы. Таким образом, мы избежим дублирования заголовочных файлов.

2.) После копирования обновите свой Android.mk. Вместо этого сделайте так, чтобы он указывал на ваш новый каталог cryptopp. Если вы следовали иерархии в шаге 1, ваш код Android.mk для cryptopp будет выглядеть примерно так:

# Crypto++ library
include $(CLEAR_VARS)

CRYPTOPP_INCL   := $(LOCAL_PATH)/Cryptopp/include
CRYPTOPP_LIB    := Cryptopp/android-$(TARGET_ARCH_ABI)/lib
LOCAL_MODULE       := cryptopp
LOCAL_SRC_FILES    := $(CRYPTOPP_LIB)/libcryptopp.a
LOCAL_CPP_FEATURES := rtti exceptions
LOCAL_EXPORT_C_INCLUDES := $(CRYPTOPP_INCL) $(CRYPTOPP_INCL)/cryptopp
include $(PREBUILT_STATIC_LIBRARY)
LOCAL_SHARED_LIBRARIES  := cryptopp

Примечание: обратите внимание, что мы не использовали $(LOCAL_PATH) для CRYPTOPP_LIB который был использован LOCAL_SRC_FILES, Это чтобы избежать отсутствия каталога: jni/jni/Cryptopp/android-$(TARGET_ARCH_ABI)/lib/libcryptopp.a, Помни что LOCAL_SRC_FILES начать поиск в jni/,

Другие вопросы по тегам