Я включил в свое приложение две родные библиотеки (.so). Библиотеки компилируются отлично, и я могу загрузить их и в приложение. В первый раз, когда я вызываю собственный метод библиотеки, он отлично работает, но если я снова вызову тот же метод в Activity, приложение отключится.Вызов собственного метода дважды из сторонней библиотеки в Activity приводит к закрытию приложения Android
Проблема я столкнулся точно так же, как указано здесь:
http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call
Решение, которое работает, чтобы вызвать нативный метод в другой деятельности и закрыть его принудительно через System.exit (0) , После статьи я попытался установить указатели на NULL вызываемого метода после успешной операции, но это тоже не помогло мне. Также невозможно выгрузить библиотеку после ее загрузки System.loadLibrary().
Я хочу несколько раз вызвать собственные методы, не создавая новую активность. Есть идеи, как решить эту проблему?
(я, наконец, нашел решение ... ЗДЕСЬ ЭТО)
Хорошо, я наконец-то нашел способ решить эту проблему. Решение на самом деле довольно просто. Создайте еще одну независимую собственную библиотеку (утилиту) для загрузки и выгрузки других библиотек. Нам нужно использовать dlopen() и dlclose() в собственном методе утилиты. Мы можем загружать библиотеку утилиты, как раньше, через System.loadLibrary().
Так в родном методе библиотеки полезности, что нам нужно сделать, это:
Использование #include <dlfcn.h>
// это необходимо для вызова dlopen() и dlclose() функции.
Предоставление обработчика и прототип функции:
void *handle;
typedef int (*func)(int); // define function prototype
func myFunctionName; // some name for the function
Открыть библиотеку с помощью dlopen():
handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY);
Получить и вызов функции библиотеки:
myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary");
myFunctionName(1); // passing parameters if needed in the call
Теперь, когда звонок завершен. Закройте его через dlclose():
dlclose(handle);
Надеюсь, что это поможет другим, столкнувшимся с одной и той же проблемой.
где вы делаете dlclose (handle)? Я имею в виду в коде Activity или JNI? –
Его в коде JNI. Это функция, доступная через заголовочный файл dlfcn.h. – ZakiMak
ok получил, я вижу, что вы загружаете и выгружаете другие библиотеки в этом классе c. Но как мне привязать его к моему Java-коду? –