2

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 ... 

「undefined reference to」エラーは通常、ライブラリが存在しないことを意味しますが、ここでは「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

0

あなたの答えにはいくつかの問題があると思います。

まず、複数のライブラリが標準ランタイムを使用する場合、静的バージョンではなく共有オブジェクト バージョンを使用する必要があります。これについては、ANDROID_NDK_ROOT/docs/CPLUSPLUS-SUPPORT.html で説明されています。

次に、ライブラリのロード順序に問題がある可能性があります。std::_Filebuf_base::_M_write(char*, int)(および友人) への参照はリンク/ロード時ではなくコンパイル時に解決されるため、静的リンクはそれを解消します。これを修正するには、最初にロードlibstlport_shared.so(または) してから、 2 番目にロードする必要があります。libgnustl_shared.solibcryptopp.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 に答える