Вы как бы между камнем и наковальней. Само по себе то, что инициализированные глобальные данные в разделяемых библиотеках фактически никогда не инициализируются. Начальные значения находятся в самом файле .so в разделах DATA, которые просто копируются в память при загрузке и вуаля! инициализированные данные.
Трудное место заключается в том, что Java JNI по своему дизайну не имеет UnloadLibrary () и указывает, что вызов LoadLibrary () для уже загруженной библиотеки должен игнорироваться.
Это еще более усложняется тем, что вы используете помощник Android NativeActivity, который скрывает вас от любой Java, которая фактически загружает библиотеку, а также от самого кода Activity, где вы можете (возможно) быть в состоянии завершить действие когда ваш нативный код готов.
Я не уверен, что дамп NativeActivity и простое написание тонкой прокладки JNI очень помогли бы, тем не менее, поскольку вы все равно не смогли бы выгрузить или перезагрузить нативный код в любом случае, и явное завершение действия в Android может быть немного хитрым. На самом деле, держу пари, вы МОЖЕТЕ сделать так, чтобы действие закончилось чисто и надежно - это не то, чем я занимаюсь, и поэтому я не очень знаком с ним.
Другой возможностью было бы построить 2 нативные библиотеки. Одним из них будет просто ваше приложение, и в нем вообще не будет кода для Android. Другая библиотека будет загружена NativeActivity с помощью android_main () и всех остальных, и она будет использовать API-интерфейс dlopen () / dlsym () / dlclose () C для загрузки, запуска и очистки библиотеки «app».
Я думаю это может сработать - но я никогда не пробовал. Заголовок для работы с общей библиотекой (dlfcn.h) находится в NDK.