将Cryptopp添加到Android.mk

时间:2016-03-16 06:31:39

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

我已经尝试为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,它演示了使用Crypto ++作为Android上的共享对象。

我被卡住了,因为我无法让它发挥作用。我对android很新,所以我不知道该怎么做。我能够运行它的ios版本。我按照XCode教程。正是这让我疯狂。我很感激能得到的所有帮助。我的构建方式有问题吗?在构建之后,我是否将其复制到我的项目或只是链接已安装的版本是好的?如何正确添加/链接到我的项目?很抱歉问了这么多问题。

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

1 个答案:

答案 0 :(得分:2)

在阅读并尝试了我的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。


SECOND - 更新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下载它。

我目前正在下载它。当我能够在我的Windows上安装make和sudo命令时,我会更新这个答案。

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

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

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/中搜索。