Я сделал основную заявку C++, которая загружает так же библиотеку, которая также была сделана мной. Оба источника имеют общий заголовок (TestFlags.h). Inside TestFlags.h У меня есть класс и объявление указателя, которое должно быть глобальным для всего приложения, которое определяет экземпляр в главном приложении и использует его внутри библиотечной функции.dlopen на Android ndk
class TestFlags {
public:
TestFlags() : behaviour(1)
{}
int behaviour;
};
extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags;
затем последовательность шагов выполнения с последующим достичь имени целей являются:
- основного приложение создает новый экземпляр TestFlags ---> gpTestFlags = новые TestFlags();
- Основное применение загрузить библиотеку ---> dlopen (library.so, RTLD_LAZY | RTLD_GLOBAL)
- вызова функции, которая находится внутри библиотеки, которая использует предыдущий экземпляр объявлен ---> gpTestFlags-> поведение = 2;
- Получено SIGSEGV: неисправность сегментация, потому что gpTestFlags является NULL
Кажется, что внутри экземпляра библиотеки gpTestFlags не рассматривается по какой-то причине. То же самое происходит и с другим статическим классом I, значениями, которые настроены на основное приложение, которое не видно внутри библиотеки.
Насколько я могу исследовать, кажется, что библиотека управляет совершенно другим пространством памяти для таких объявлений, как если бы оно было дублировано.
К сожалению, код предназначен для перекрестной платформы. в windows делает именно то, что мне нужно, изменяя dlopen с помощью LoadLibrary и __attribute __ ((visibily («default»)) с __declspec (dllimport/dllimport). – walter
Еще одна вещь, которую я заметил, это то, что, взглянув на исходный код dlopen для Android, игнорирует параметр флага – walter