Cómo utilizar C ++ macro dlopen para cargar una biblioteca de código C ++ en lugar de JAVA

Falcuun:

Estoy tratando de utilizar algún código ya escrito en C ++ para la comunicación del servidor en mi aplicación Android (Básicamente la creación de un cliente), por desgracia, la lógica del código depende de este trozo de código:

#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif

El código se llama a partir de:

m_hmod = LoadLib(m_namespace::LIBRARY);

dónde LIBRARY = "nameofmylib.so"

El problema es que cuando llamo loadlib, mi m_var sigue siendo nulo, lo que significa que no puede encontrar la biblioteca (que es mi suposición hasta ahora) y así mi lógica entra en el manejo de errores en lugar de conectarse a la toma de corriente.

Hasta ahora, he estado navegando Stackoverflow y tratando de soluciones con personas sugieren cambiar el archivo Gradle y ajustando CMakeList.txt pero ninguno trabaja. He estado debugging por pocas horas, así, e incluso he intentado buscar la ubicación .so el interior del dispositivo Android File Estudio Explorer, por lo que podría poner en el camino absoluto. Pero eso también produjo ningún resultado.

El flujo de carga completa es la siguiente:

#ifndef LoadLib
#define LoadLib(a) (hmod)dlopen(a, RTLD_NOW)
#endif


typedef void * hmod;
hmod m_hmod;

m_hmod = LoadLib(m_namespace::LIBRARY);

if (m_hmod) {
    ... Some code that needs to execute ...
} else {
    ... What actually happens ...
}

El código que estoy trabajando no es algo que escribí, pero tengo que se adhieren a ella, por lo tanto tengo que usar la lógica que hay dentro de ella en lugar de volver a escribir y hacer mi propia.

Alex Cohn:

Lo más probable es m_namespace::LIBRARYque no se está embalado en el APK. Para comprobar esto, no es necesario examinar los archivos de dispositivo. Android Studio proporciona un comando de menú para analizar el archivo APK.

Si la biblioteca no se encuentra, usted debe preguntarse si el nombre de Android sigue reglas: debe comenzar con lib y debe terminar con .so . No hay sufijos de números, no hay caracteres adicionales, y Dios no lo quiera, sin espacios.

Si el nombre de la biblioteca está bien, pero es creado previamente usada por el script de CMake, comprobar que está disponible para la ITB de su dispositivo. Además, asegúrese de que su trayectoria aparece en jniLibs.src lista en build.gradle .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=337169&siteId=1
Recomendado
Clasificación