Como usar o C ++ macro dlopen para carregar uma biblioteca de código C ++ em vez de JAVA

Falcuun:

Estou tentando usar algum código já escrito C ++ para comunicação servidor no meu aplicativo Android (basicamente a criação de um cliente), infelizmente, a lógica do código depende este pedaço de código:

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

O código é chamado de:

m_hmod = LoadLib(m_namespace::LIBRARY);

Onde LIBRARY = "nameofmylib.so"

O problema é que quando eu chamo loadlib, meu m_var permanece NULL, o que significa que não é possível encontrar a biblioteca (que é o meu palpite até agora) e assim por minha lógica vai para tratamento de erros ao invés de conectar à tomada.

Até agora, eu estive surfando StackOverflow e tentando soluções pessoas sugerem com a mudança do arquivo Gradle e ajustando CMakeList.txt mas nenhum trabalho. Eu tenho depurá-lo por algumas horas, bem como, e eu até tentei olhar para a localização .so dentro do Android Estúdio Dispositivo File Explorer, para que eu pudesse colocar no caminho absoluto. Mas isso também não produziu resultados.

O fluxo completo de carregamento é assim:

#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 ...
}

O código que eu estou trabalhando com não é algo que eu escrevi, mas eu tenho que cumpri-lo, portanto, eu preciso usar a lógica que está dentro dela, em vez de reescrevê-lo e fazer o meu próprio.

Alex Cohn:

Muito provavelmente, m_namespace::LIBRARYnão está sendo embalado para o APK. Para verificar isso, você não precisa de examinar os arquivos de dispositivos. Estúdio Android fornece um comando de menu para analisar o seu APK.

Se a biblioteca está faltando, você deve se perguntar se o nome segue as regras Android: ela deve começar com lib e deve terminar com .so . Não sufixos número, não caracteres extras, e Deus me livre, sem espaços.

Se o nome da biblioteca é OK, mas é pré-construídos usado pelo seu CMake roteiro, verifique se ele está disponível para a ABI do seu dispositivo. Além disso, certifique-se de que seu caminho é listado na jniLibs.src lista em build.gradle .

Acho que você gosta

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