将 Cryptopp 添加到 Android.mk

Adding Cryptopp to Android.mk

我已经尝试为 android.I 构建 cryptopp 库并使用了教程的这一部分。 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 which referenced AndroidPRNG,它演示了如何使用 Crypto++ 作为 Android 上的共享对象。

我卡住了,因为我无法让它工作。我是 android 的新手,所以我不知道该怎么做。我能够制作它的 ios 版本 运行。我遵循了 XCode 教程。就是这个让我发疯。我将不胜感激我能得到的所有帮助。我的构建方式有问题吗?构建后,我是将它复制到我的项目中还是只链接已安装的版本就可以了?我如何正确地 add/link 它到我的项目?抱歉问了这么多问题。

PS: 我正在为我的项目使用 cocos2dx。也许值得一提。

在为我的 Android.mk 阅读并尝试各种组合后,我能够使用 cocos2dx 编译 cryptopp。

无论如何,这是我修复编译器错误的方法:

首先 - 构建库

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 时,我将更新这个答案。

与此同时,假设您已在 mac 中成功编译它,这是我在 Windows 中使用 cryptopp 编译我的项目所做的:
1.) 将 cryptopp android 特定库和头文件从 /usr/local/cryptopp 复制到您的 jni 文件夹。它应该看起来像这样:

注意:在 /usr/local/cryptopp 中,包含文件位于特定的 android 文件夹中。在上面的示例中,我将包含文件放在外面,因为它们都使用相同的头文件。这样,我们将避免重复的头文件。

2.) 复制后,更新您的 Android.mk。让它指向你的新 cryptopp 目录。如果您遵循步骤 1 中的层次结构,您的 cryptopp Android.mk 代码将如下所示:

# 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_SRC_FILES 使用的 CRYPTOPP_LIB 使用 $(LOCAL_PATH)。这是为了避免缺少目录:jni/jni/Cryptopp/android-$(TARGET_ARCH_ABI)/lib/libcryptopp.a。请记住 LOCAL_SRC_FILESjni/ 中开始搜索。