Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')-ThrowExceptions

Exception or error:

I’m getting this output after adding in a set of code from a colleague:

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

This is caused because I don’t have access to the correct STL.

To my knowledge there are only three I can choose from (stlport_static, stlport_shared, system) as set by APP_STL := stlport_static in

Is there another library available to the NDK?

How to solve:

After reading android-ndk/docs/CPLUSPLUS-SUPPORT.html I found that there a couple more libraries that I can link to:

             C++       C++   Standard
          Exceptions  RTTI    Library

system        no       no        no
gabi++        no      yes        no
stlport       no      yes       yes
gnustl       yes      yes       yes

This stops my linker errors (and pushes the build onto a new set of errors :))

APP_STL := gnustl_static


Take a look here: Linux C++: Linker is outputting strange errors.

In Android’s this would be:

APP_CPPFLAGS := -frtti


You can fix this problem by adding the compiler option -lsupc++.

The reason: your code is using C++ exception mechanism which compiler automatically generate try/catch/finally block hidden code which in turn call __cxa_end_cleanup somewhere.
lsupc++ means link to libsupc++.a

Another way to resolve this problem is add -fno-exceptions option to gcc which obviously means disable exception handler mechanism.

BTW, you should also add -fno-rtti to avoid other maybe-encountered compilation error, this is because
all android’s C++ class is compiled without dynamic type info in class memory layout.

In a word, you shoud use one of these option combos:
1. -fno-rtti -fno-exceptions
2. -fno-rtti -lsupc++


In my case, the error undefined reference to __cxa_end_cleanup shows up when I add -fexceptions to the compiler options. When removing that option, the undefined ref goes away, but that means you have to clear your code from exception statements.


for me that meant adding -fno-rrti and -fno-exceptions then getting rid of “throw char*” in the code which took care of both.

Leave a Reply

Your email address will not be published. Required fields are marked *