Вопрос:

В Android-ndk, Как заставить _fini () вызываться при вызове dlclose ()?

android c android-ndk

51 просмотра

1 ответ

55 Репутация автора

Мы используем библиотеки C в нашем проекте Android-NDK. Мы используем dlopen () & dlclose () для работы с нашими библиотеками в Android NDK. Когда мы вызываем dlopen (), _init () библиотеки вызывается, как и ожидалось. Наоборот, когда мы закрываем библиотеку с помощью вызова dlclose (), функция _fini () не вызывается. Мы не хотим явно вызывать функцию _fini () после вызова API dlclose (). Я тестирую их на API 24.

Согласно linux, две функции _init () и _fini () должны вызываться, когда мы вызываем dlopen () и dlclose () соответственно.

void func( ){
...
   int ret = -1;
   handle = dlopen( "mylib.so", RTLD_NOW | RTLD_GLOBAL );
   ret = dlclose( handle );    // dlclose() is returning 0.
...
}

void _init( ){
   log("dlopen is loading the library");
}

void _fini( ){
   log("dlclose is unloading the library");
}

Я также попытался изменить синтаксис _fini (), как показано ниже, но безуспешно.

void _fini() __attribute__((destructor));

Даже с атрибутом «деструктор», как и в предыдущей строке, _fini () не вызывается из dlclose ().

Поскольку функция _init () вызывается для dlopen (), я уверен, что _fini () также следует вызывать для dlclose (), поэтому я должен что-то упустить. Мы используем Android Studio для сборки apk. Может кто-нибудь, пожалуйста, помогите мне в этом. Заранее спасибо.

Автор: Learner Источник Размещён: 10.06.2019 07:19

Ответы (1)


0 плюса

5903 Репутация автора

Лучший совет, который я могу дать dlclose- никогда не использовать dlclose.

dlcloseне указано ничего делать, кроме как сообщить среде выполнения, что она может выгружать библиотеку; среда выполнения не должна ничего с этим делать. Для систем, в которых реализована выгрузка (включая Android), это не всегда возможно, потому что такие вещи, как atexitобработчики (или обработчики выхода потока и т. Д.) Не могут быть запущены до завершения всей программы, поэтому каждый раз, когда библиотека регистрирует такой обработчик, это невозможно выгружен. Это, кажется, имеет место здесь.

Точный вариант использования может привести к изменению ответа, но в тех случаях, когда мы видели, что такого рода поведение не может быть удалено (интерфейс плагина, в котором ожидаются выгрузка плагинов, а затем перезагрузка со сбросом всех состояний), исправление это добавить явные Initialize()и ShutDown()функции в библиотеку. Они должны вызываться пользователем библиотеки, а не полагаться на dlopen/ dlclose.

Автор: Dan Albert Размещён: 12.06.2019 09:23
Вопросы из категории :
32x32