O que poderia causar Sigsegv ao chamar NewObjectArray para JNI no Android?
-
22-09-2019 - |
Pergunta
Comecei a trabalhar com o Android NDK, mas continuo recebendo Sigsegv quando tenho essa chamada no meu código C:
jobjectArray someStringArray;
someStringArray = (*env)->NewObjectArray(env, 10,
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, ""));
Base em todo o exemplo que posso encontrar, o código acima está correto, mas continuo obtendo o SigSergv e tudo está ok se a linha NewObjectArray for comentada. Alguma ideia do que poderia causar esse problema?
Solução
Isso parece certo, então acho que você fez algo mais errado. Presumo que você esteja correndo com o checkjni? Você pode querer dividir isso em várias linhas: faça o FindClass e verifique o valor de retorno, faça o NewsTRINGUTF e verifique o valor de retorno e ligue para o NewObjectArray.
BTW, você pode querer passar nulo como o argumento final; Esse padrão de uso da string vazia como valor padrão para cada elemento da matriz é comumente usado (acho que é copia e colada a partir de alguma documentação do sol e se espalhou a partir daí), mas raramente é útil e é um pouco desperdiçada. (e não corresponde ao comportamento de "New String [10] em Java.)
Outras dicas
Eu acho que uma das causas possíveis é que, em um método JNI de longo prazo, a VM aborta ao sair dos slots de referência local por invocação por method (normalmente 512 slots no Android).
Como as funções findClass () e Newstringutf () alocavam referências locais, se você permanecer em um método JNI por um longo tempo, a VM não sabe se uma referência local específica deve ser reciclada ou não. Portanto, você deve ligar explicitamente a deletelocalref () para liberar as referências locais adquiridas quando não for necessário mais. Se você não fizer isso, as referências locais "zumbi" ocuparão slots na VM, e a VM aborta enquanto fica sem todos os slots de referência local.
No método JNI de curto prazo, isso pode não ser um problema devido a todas as referências locais seriam recicladas ao sair de um método JNI.