2

经过两天多的构建错误,我放弃了......

我在这里遵循了这个很好的教程:http://www.cryptopp.com/wiki/Android_(Command_Line)。它编译,“cryptest.exe”通过所有测试。所以,我猜静态库“libcryptopp.a”是可以的。

因此,我移动了“libcryptopp.a”和 Android 项目中的所有头文件。

但是当涉及到构建步骤时(通常... :-) ),会出现编译错误,例如:

    .../Classes/libs/android/libcryptopp.a(files.o): in function std::basic_filebuf<char, std::char_traits<char> >::_M_unshift() 
    [clone .part.40]:/Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/stlport/stlport/stl/_fstream.h:322: 
    error: undefined reference to 'std::_Filebuf_base::_M_write(char*, int)' 

    and ~50 others ... 

“未定义的引用”错误通常意味着库不存在,但“libcryptopp.a”在这里是正确的。所以我希望“Android.mk”中缺少一些东西:

    include $(CLEAR_VARS) 
    LOCAL_MODULE    := cryptopp-prebuilt 
    LOCAL_SRC_FILES := ...narf/Classes/libs/android/libcryptopp. 
    include $(PREBUILT_STATIC_LIBRARY) 


    include $(CLEAR_VARS) 
    /* 
       here are included other library 
    */ 

    LOCAL_STATIC_LIBRARIES := cryptopp-prebuilt                 
    include $(BUILD_SHARED_LIBRARY) 

在尝试使用“APP_STL := stlport_static/dynamic”、“APP_STL := gnustl_static/dynamic”等之后......不再有机会了。

真的不是构建/编译专家(在 Android 上更糟),有人可以帮助我。非常感谢!

4

2 回答 2

3

好的。它现在正在工作!

因此,“libcryptopp.a”的链接不适用于我的 Android 项目与“stlport”,而仅适用于“gnustl_static”。也许是因为其他人包括像“cocosd2-x”。

因此,按照教程“ http://www.cryptopp.com/wiki/Android_(Command_Line) ”,您必须更改脚本“setenv-android.sh”以获得如下结果:

    ANDROID_STL_INC: /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/
    ANDROID_STL_LIB: /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/libgnustl_static.a

并移动文件(仅用于编译)

    /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi/include/bits 

    /Users/toto/Developer/NDKs/AndroidNDKs/android-ndk-r8e/sources/cxx-stl/gnu-libstdc++/4.6/include/bits

否则有编译问题...

哎呀!

于 2013-08-30T09:09:32.817 回答
0

我认为你的回答有几个问题。

首先,当多个库使用标准运行时,您必须使用共享对象版本而不是静态版本。这在 ANDROID_NDK_ROOT/docs/CPLUSPLUS-SUPPORT.html 中有介绍。

其次,您可能对库加载顺序有疑问。静态链接使其消失,因为对std::_Filebuf_base::_M_write(char*, int)(和朋友)的引用是在编译时解决的,而不是链接/加载时。要解决此问题,您必须先加载libstlport_shared.so(或libgnustl_shared.so),然后再加载libcryptopp.so

如果您libcryptopp.so先加载,则没有运行时加载到进程中来解析std::_Filebuf_base::_M_write(char*, int)(和朋友)。这在 wiki 页面下有LD_PRELOAD技巧。

要在 Android Java 中修复它,您将执行以下操作。请参阅-rpath 是否有效?详情。

static {
    System.loadLibrary("stlport_shared");
    System.loadLibrary("cryptopp");
}

Crypto+++ Andrid wiki 页面已更新:http ://www.cryptopp.com/wiki/Android_(ommand_Line)#Android_Activity 。

于 2013-10-02T06:08:50.367 回答