У меня есть некоторые проблемы при использовании API динамической загрузки (
: dlopen ()
, dlclose ()
и т. Д.) На Android.
Я использую автономный набор инструментов NDK (версия 8) для компиляции приложений и библиотек.
Версия Android - 2.2.1 Froyo.
Вот исходный код простой разделяемой библиотеки.
#include <stdio.h>
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
printf("aaa %d\n", iii);
}
Вот исходный код программы, которая использует указанную библиотеку.
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
void *handle;
typedef int (*func)(int);
func bbb;
printf("start...\n");
handle = dlopen("/data/testt/test.so", RTLD_LAZY);
if (!handle)
{
return 0;
}
bbb = (func)dlsym(handle, "aaa");
if (bbb == NULL)
{
return 0;
}
bbb(1);
dlclose(handle);
printf("exit...\n");
return 0;
}
С этими исходниками все работает нормально, но когда я пытаюсь использовать некоторые функции или классы STL, программа вылетает из-за ошибки сегментации , когда функция main ()
завершается, например, при использовании этого исходного кода для разделяемой библиотеки .
#include <iostream>
using namespace std;
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
cout << iii << endl;
}
При использовании этого кода программа завершает работу с ошибкой сегментации после или во время выхода из функции main ()
.
Я попробовал пару тестов и нашел следующие результаты.
dlclose ()
в конце, все работает хорошо. -fno-use-cxa-atexit
или -fuse-cxa-atexit
, результат тот же. ] Что не так в моем коде, использующем STL?