【问题标题】:Adding Cryptopp to Android.mk将 Cryptopp 添加到 Android.mk
【发布时间】:2016-03-16 06:31:39
【问题描述】:

我已经尝试为 android 构建 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++ wiki 页面 Android Activity,它引用了 AndroidPRNG,它演示了在 Android 上使用 Crypto++ 作为共享对象。

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

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

【问题讨论】:

  • 另外,如果 Cocos2d-x 正在使用 GNU 运行时,那么您需要切换到 GNU,并停止使用 STLport。混合和匹配这些运行时会导致模糊的内存错误。
  • @jww 我已经问过我的问题了。我如何正确构建它?我将对构建的库做什么,将其复制到项目中或在安装后将其链接?如何在 android.mk 中正确地将其链接到我的项目?
  • @jww 我试过了,但是当我运行我的项目 T_T 时出现编译器错误,就像它无法引用 CryptoPP 类的 vtable 一样
  • @jww 我认为我链接它的方式有问题,这就是为什么我将用于链接库的部分代码粘贴到我的 android.mk 中:(

标签: android shared-libraries cocos2d-x static-libraries crypto++


【解决方案1】:

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

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

FIRST - 构建库

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



---------------------------------------- FOR 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_PATH) 用于 CRYPTOPP_LIB,而 LOCAL_SRC_FILES 使用了它。这是为了避免丢失目录:jni/jni/Cryptopp/android-$(TARGET_ARCH_ABI)/lib/libcryptopp.a。请记住 LOCAL_SRC_FILES 开始在 jni/ 中搜索。

【讨论】:

  • gnu-static 似乎是错误的选择,因为 Crypto++ 和 Cocos2dx 都在使用它。我相信 Android NDK 发行说明声明在这种情况下您必须使用gnu-shared,并声明您不能使用静态库。如果你遇到模糊的内存错误,那么一定要切换到gnu-shared
  • 嗨,@jww 先生,当我使用 gnu-static 时它起作用了。我能够编译它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多