【问题标题】:Library build error on AndroidAndroid上的库构建错误
【发布时间】:2013-08-29 14:28:34
【问题描述】:

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

我在这里遵循了这个很好的教程: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 上更糟),有人可以帮助我。 非常感谢你!

【问题讨论】:

    标签: android build crypto++


    【解决方案1】:

    好的。它现在正在工作!

    所以“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
    

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

    哎呀!

    【讨论】:

      【解决方案2】:

      我认为您的回答存在一些问题。

      首先,当多个库使用标准运行时,您必须使用共享对象版本,而不是静态版本。 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 wiki 页面已更新:http://www.cryptopp.com/wiki/Android_(ommand_Line)#Android_Activity

      【讨论】:

      • 是的。它适用于静态版本,但这不是正确的方法。感谢您更新 wiki。
      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2018-11-07
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-02
      相关资源
      最近更新 更多