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.
Muito provavelmente, m_namespace::LIBRARY
nã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 .