Android上的库构建错误

时间:2013-08-29 14:28:34

标签: android build crypto++

经过两天以上的建设错误,我放弃了......

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

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

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

    .../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上更糟糕),有人可以帮助我。 非常感谢你!

2 个答案:

答案 0 :(得分:3)

确定。它现在正在运作!

所以“libcryptopp.a”的链接在我的Android项目中没有使用“stlport”,而只能用“gnustl_static”。也许是因为其他人包括像“cocosd2-x”。

因此,在tuto“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

否则会出现编译问题......

OUF!

答案 1 :(得分: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中修复它,您将执行以下操作。有关详细信息,请参阅Is -rpath working?

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

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