Tengo algunos problemas al usar la API de carga dinámica (<dlfcn.h>
: dlopen()
, dlclose()
, etc.) en Android. Estoy usando la cadena de herramientas independiente NDK (versión 8) para compilar las aplicaciones y bibliotecas. La versión de Android es 2.2.1 Froyo.Error de segmentación al utilizar dlclose (...) en la plataforma Android
Aquí está el código fuente de la biblioteca compartida simple.
#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);
}
Aquí está el código fuente del programa que utiliza la biblioteca mencionada.
#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;
}
Con estas fuentes todo está funcionando bien, pero cuando trato de utilizar algunas funciones STL o clases, el programa se bloquea con un error de segmentación, cuando los main()
sale de la función, por ejemplo, cuando se utiliza esta código fuente para la biblioteca compartida.
#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;
}
Con este código, el programa se bloquea con el fallo de segmentación después o durante la salida de la función main()
. He intentado un par de pruebas y encontré los siguientes resultados.
- Sin usar STL todo está funcionando bien.
- Cuando use STL y no llame al
dlclose()
al final, todo está funcionando bien. - He intentado compilar con varios indicadores de compilación como
-fno-use-cxa-atexit
o-fuse-cxa-atexit
, el resultado es el mismo.
¿Qué hay de malo en mi código que usa el STL?
+1 Buena pregunta formateada;) –
¿El encabezado STL está en el encabezado de ese archivo? ¿Podría llevarlo solo al archivo cpp? (Entonces STL no estará en la interfaz.) ¿Están la definición y la declaración separadas? – Naszta
Supongo que está hablando de la función aaa (...), si es así, entonces la declaración y la definición están en archivos diferentes. El archivo de encabezado de definición es '#ifdef __cplusplus extern" C " #endif int aaa (int i);' –