I have a global string _fsRoot declared in one .cpp file and referenced as extern string _fsRoot in several others. The .cpp files are compiled into a shared library, and loaded by the MainActivity of my Android app in the standard way. I was getting immediate segfaults (java.lang.NullPointerException) upon load of my shared library until I changed the order that the object files are added to the shared library. Note that the library compiles and links fine either way. The global string is defined in notesmanager.cpp. The following does not lead to a crash at runtime:
/usr/local/android-sdk/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
-Wl,-soname,libnotes2dtester.so -shared
--sysroot=/usr/local/android-sdk/android-ndk-r10c/platforms/android-19/arch-arm
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/notesmanager.o
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/pstring.o
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/notes2fs.o
./../../libcurl-android/prebuild-with-ssl/armeabi-v7a/libcurl.a
/usr/local/android-sdk/android-ndk-r10c/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/thumb/libgnustl_static.a
-lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
-L/usr/local/android-sdk/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib -lz -landroid -lc -lm
-o ./obj/local/armeabi-v7a/libnotes2dtester.so
The following does lead to a crash at runtime:
/usr/local/android-sdk/android-ndk-r10c/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++
-Wl,-soname,libnotes2dtester.so -shared
--sysroot=/usr/local/android-sdk/android-ndk-r10c/platforms/android-19/arch-arm
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/pstring.o
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/notes2fs.o
./obj/local/armeabi-v7a/objs-debug/notes2dtester/jni/notesmanager.o
./../../libcurl-android/prebuild-with-ssl/armeabi-v7a/libcurl.a
/usr/local/android-sdk/android-ndk-r10c/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/thumb/libgnustl_static.a
-lgcc -no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
-L/usr/local/android-sdk/android-ndk-r10c/platforms/android-19/arch-arm/usr/lib -lz -landroid -lc -lm
-o ./obj/local/armeabi-v7a/libnotes2dtester.so
Here is the loading of the library in MainActivity.java (crashes occur on final load, of course).
public native int doSomething();
static {
System.loadLibrary("z");
System.loadLibrary("log");
System.loadLibrary("android");
System.loadLibrary("stdc++");
System.loadLibrary("m");
System.loadLibrary("c");
System.loadLibrary("dl");
System.loadLibrary("notes2dtester");
}
How is this possible, is it expected, and is there a way around it? I already realize that global class instances are a bad idea, and will hopefully do a second iteration of my code to remove them.