Pergunta

Quero alocar alguma memória em C e mantê -la associada a uma instância do objeto Java, assim:

void configure(JNIEnv *object, jobject obj, ....) {
  char *buf = new char[1024];
  // associated <buf> with <obj> somehow
}

E depois liberte a memória quando o objeto Java recebe o lixo coletado - eu poderia fazer isso chamando uma função jni do finalizar() Método do objeto Java.

A questão é: como associo um ponteiro C ao objeto Java? Manter uma grandes campo no objeto e lançar o ponteiro para grandes? Existe uma maneira melhor?

Foi útil?

Solução

Geralmente, se você deseja transferir um ponteiro de C para Java, é recomendável usar long Para que haja bits suficientes para manter o valor do ponteiro, caso a plataforma seja de 64 bits.

Então, dê uma olhada em ByteBuffer.allocateDirect() o que cria um ByteBuffer instância qual memória pode ser compartilhada com C. você pode alocar tal direto ByteBuffer Do lado do Java, depois passa como um jobject Para uma função JNI e dentro desta função JNI, você usa o GetDirectBufferAddress função.

Outra maneira é embrulhar uma área nativa de memória com o NewDirectByteBuffer JNI funcionam do lado nativo. Dá a você um jobject Você volta ao lado do Java (preste atenção às referências locais e globais). Preste atenção ao fato de que uma vez direto ByteBuffer Isso envolve a memória nativa foi criada, você ainda é responsável por gerenciar a memória nativa: em algum momento, você terá que ligar delete buf; No seu código nativo, o Java não fará isso por você.

Outras dicas

Java não tem nenhum conceito de ponteiro nativo, então armazená -lo como um longo é a única opção real. Mas você não deve confiar em finalize para libertar o ponteiro; O método Finalize não é confiável como um meio de limpar os recursos. Ver essa questão para mais detalhes.

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