J'obtiens cette sortie après avoir ajouté un ensemble de code à un collègue:
./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'
Cela est dû au fait que je n'ai pas accès à la STL correcte.
À ma connaissance, il n’ya que trois choix possibles (stlport_static
, stlport_shared
, system
) définis par APP_STL := stlport_static
dans Application.mk
.
Existe-t-il une autre bibliothèque disponible pour le NDK?
Après avoir lu Android-ndk/docs/CPLUSPLUS-SUPPORT.html
, j’ai trouvé qu’il y avait encore quelques bibliothèques auxquelles je pouvais accéder:
C++ C++ Standard
Exceptions RTTI Library
system no no no
gabi++ no yes no
stlport no yes yes
gnustl yes yes yes
Cela arrête mes erreurs de l'éditeur de liens (et pousse la construction sur un nouvel ensemble d'erreurs :))
Application.mk
APP_STL := gnustl_static
Vous pouvez résoudre ce problème en ajoutant l'option du compilateur -lsupc++
.
Modifié: La raison: votre code utilise le mécanisme d’exception C++ qui permet au compilateur de générer automatiquement try/catch/finally pour bloquer le code caché qui, à son tour, appelle __cxa_end_cleanup quelque part. Lsupc ++ signifie un lien vers libsupc ++.
Un autre moyen de résoudre ce problème consiste à ajouter l'option -fno-exceptions à gcc, ce qui signifie évidemment désactiver le mécanisme de gestion des exceptions.
Par ailleurs, vous devez également ajouter -fno-rtti pour éviter d’autres erreurs de compilation rencontrées, car Toute la classe C++ d’Android est compilée sans informations de type dynamique dans la structure de la mémoire de classe.
Dans un Word, vous devez utiliser l’une des combinaisons suivantes: 1. -fno-rtti -fno-exceptions 2. -fno-rtti -lsupc ++
Jetez un oeil ici: Linux C++: Linker génère des erreurs étranges .
Dans Application.mk d'Android, ce serait:
APP_CPPFLAGS := -frtti
Dans mon cas, l'erreur référence non définie à __cxa_end_cleanup
apparaît lorsque j'ajoute -fexceptions
aux options du compilateur. Lorsque vous supprimez cette option, la référence non définie disparaît, mais cela signifie que vous devez effacer votre code des instructions d'exception.
pour moi, cela impliquait d'ajouter -fno-rrti et -fno-exceptions, puis d'éliminer "throw char *" dans le code qui prenait soin des deux.