Pergunta

Quero carregar a biblioteca JNI de terceiros em tempo de execução.
Eu tentei carregar diretamente do SDCARD. Esperava que falhasse.
Eu tentei copiar a biblioteca de sdcard para/data/dados/app/e depois
System.load(/data/data/app/libjni.so)
Funciona no HTC Hero, mas falha na lenda do HTC com o Android 2.1. Ele falha durante a execução do código nativo e grava para registrar a pilha desinformativa Trace alguma outra maneira de fazê -lo? Essa é a melhor peça de código, que funciona em 1.5 (HTC Hero), mas Donot trabalha no 2.1 (HTC Legend).

FileInputStream fis = new FileInputStream("/sdcard/libjni.so");
File nf = new File("/data/data/app/libjni.so");
FileOutputStream fos = new FileOutputStream(nf);
byte[] buf = new byte[2048];
int n;
while ((n = fis.read(buf)) > 0)
    fos.write(buf, 0, n);
fis.close();
fos.close();
System.load("/data/data/app/libjni.so");
Foi útil?

Solução

O carregador dinâmico do Android não pode carregar o código executável do sistema de arquivos do SDCARD, porque é marcado não executável e você não pode mapear as páginas de memória executável a partir de armazenamento não executável. (Em teoria, você pode copiar manualmente o conteúdo em páginas mapeadas anônimas executáveis, mas isso é feio. Versões do Android Supporting Apps no SD montam um sistema de arquivos executável contido em um arquivo no SDCARD, mas um aplicativo de terceiros não pode escrever isso)

Mas o que você pode fazer é escrever uma biblioteca para um local gravável em interno Armazenamento - não o diretório Lib ao qual você não tem acesso a gravação, mas outro encontrado no context.getdir () ou context.getfilesdir () e, em seguida, carregue -o usando o caminho completo e o nome do .So usando o System.load ( ) em vez de system.loadlibrary ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top