2013-12-17 3 views
2

Я сделал основную заявку C++, которая загружает так же библиотеку, которая также была сделана мной. Оба источника имеют общий заголовок (TestFlags.h). Inside TestFlags.h У меня есть класс и объявление указателя, которое должно быть глобальным для всего приложения, которое определяет экземпляр в главном приложении и использует его внутри библиотечной функции.dlopen на Android ndk

class TestFlags { 
public: 
    TestFlags() : behaviour(1) 
     {} 
    int behaviour; 
}; 

extern __attribute__ ((visibility("default"))) TestFlags * gpTestFlags; 

затем последовательность шагов выполнения с последующим достичь имени целей являются:

  1. основного приложение создает новый экземпляр TestFlags ---> gpTestFlags = новые TestFlags();
  2. Основное применение загрузить библиотеку ---> dlopen (library.so, RTLD_LAZY | RTLD_GLOBAL)
  3. вызова функции, которая находится внутри библиотеки, которая использует предыдущий экземпляр объявлен ---> gpTestFlags-> поведение = 2;
  4. Получено SIGSEGV: неисправность сегментация, потому что gpTestFlags является NULL

Кажется, что внутри экземпляра библиотеки gpTestFlags не рассматривается по какой-то причине. То же самое происходит и с другим статическим классом I, значениями, которые настроены на основное приложение, которое не видно внутри библиотеки.

Насколько я могу исследовать, кажется, что библиотека управляет совершенно другим пространством памяти для таких объявлений, как если бы оно было дублировано.

ответ

1

Это ожидаемый способ работы dlopen().

Два модуля имеют независимые глобальные символы, называемые gpTestFlags. Если вы попытаетесь связать их вместе, компоновщик будет кричать о дубликатах.

Вы можете объявить указатель в библиотеке слабым, или вы можете использовать dlsym(), чтобы программно разрешить связь.

+0

К сожалению, код предназначен для перекрестной платформы. в windows делает именно то, что мне нужно, изменяя dlopen с помощью LoadLibrary и __attribute __ ((visibily («default»)) с __declspec (dllimport/dllimport). – walter

+0

Еще одна вещь, которую я заметил, это то, что, взглянув на исходный код dlopen для Android, игнорирует параметр флага – walter

Смежные вопросы