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?

Foi útil?

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.

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