同僚から一連のコードを追加した後、次の出力が得られます。
./obj/local/armeabi/objs/jniWrapper/native.o: In function `_Vector_base':
D:/opt/Android-ndk/sources/cxx-stl/stlport/stlport/stl/_vector.h:73: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt6vectorIhSaIhEEC1ERKS1_[std::vector<unsigned char, std::allocator<unsigned char> >::vector(std::vector<unsigned char, std::allocator<unsigned char> > const&)]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `std::__node_alloc::deallocate(void*, unsigned int)':
D:/opt/Android-ndk/sources/cxx-stl/stlport/stlport/stl/_alloc.h:161: undefined reference to `__cxa_end_cleanup'
./obj/local/armeabi/objs/jniWrapper/native.o:(.ARM.extab.text._ZNSt4priv12_String_baseIcSaIcEED2Ev[std::priv::_String_base<char, std::allocator<char> >::~_String_base()]+0x0): undefined reference to `__gxx_personality_v0'
./obj/local/armeabi/objs/jniWrapper/native.o: In function `basic_string':
D:/opt/Android-ndk/sources/cxx-stl/stlport/stlport/stl/_string.c:643: undefined reference to `__cxa_end_cleanup'
これは、正しいSTLにアクセスできないことが原因です。
私の知る限り、stlport_static
のstlport_shared
で設定されているように、(APP_STL := stlport_static
、Application.mk
、system
)から選択できるのは3つだけです。
NDKで利用できる別のライブラリはありますか?
読んだあと Android-ndk/docs/CPLUSPLUS-SUPPORT.html
リンクできるライブラリがさらにいくつかあることがわかりました。
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes
これにより、リンカーエラーが停止します(ビルドが新しいエラーセットにプッシュされます:))
Application.mk
APP_STL := gnustl_static
この問題は、コンパイラオプション-lsupc++
を追加することで修正できます。
編集:理由:あなたのコードはC++例外メカニズムを使用しており、コンパイラーは自動的にtry/catch/finalブロック隠しコードを生成し、それがどこかで__cxa_end_cleanupを呼び出します。 lsupc ++は、libsupc ++。aへのリンクを意味します。
この問題を解決する別の方法は、gccに-fno-exceptionsオプションを追加することです。これは、明らかに例外ハンドラメカニズムを無効にすることを意味します。
ところで、他の発生する可能性のあるコンパイルエラーを回避するために、-fno-rttiも追加する必要があります。これは、すべてのAndroidのC++クラスがクラスメモリレイアウトの動的型情報なしでコンパイルされるためです。
つまり、次のオプションの組み合わせのいずれかを使用する必要があります。1。-fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++
ここを見てください: Linux C++:リンカーが奇妙なエラーを出力しています 。
AndroidのApplication.mkでは、これは次のようになります。
APP_CPPFLAGS := -frtti
私の場合、コンパイラオプションに__cxa_end_cleanup
を追加すると、-fexceptions
への未定義のエラー参照が表示されます。そのオプションを削除すると、未定義のrefはなくなりますが、それは例外ステートメントからコードをクリアする必要があることを意味します。
私にとっては、-fno-rrtiと-fno-exceptionsを追加してから、両方を処理するコードの「throwchar *」を削除することを意味しました。