Pergunta

Eu fui um desenvolvedor java para um par de anos e tenho ouvido que você pode fazer algumas coisas muito úteis e poderosas com JNI. Eu não sei se eu simplesmente não têm necessidade de usá-lo ou se ele não é muito relevante para mim; mas eu não tinha que tocá-lo em tudo.

Eu estou querendo saber qual a utilidade deste aspecto do Java é. Exemplos seria ótimo.

Foi útil?

Solução

É muito útil. Eu posso ver 2 principais razões para usar JNI (provavelmente existem mais).

  1. Performance. Se você tem um pedaço de código em que o Java Runtime por qualquer motivo não pode cortá-la desempenho sábio. Você pode implementar essa função em código nativo e chamá-lo de Java. Isso permite que você ajuste mão a implementação se você realmente necessidade. Esta é provavelmente a razão menos comum, porém, Java geralmente executa muito bem.

  2. O acesso a APIs específicas do sistema operacional. Este é um biggie. Eu tive um caso em que eu precisava fazer alguma coisa em Java, mas também precisava de acesso a algo que Java simplesmente não poderia fornecer. No meu caso, foi soquetes de domínio UNIX. Uma vez que (como você pode dizer pelo nome) são UNIX específico, não há nenhuma maneira padrão Java para usá-los. Então eu fiz uma classe que agiu como um invólucro em torno deles em C e acessado com JNI. viola, problema resolvido.

Outras dicas

Eu escrevi uma extensa camada de JNI para os iSeries para acessar o DB2, as filas de usuários, filas de dados e algumas outras OS / 400 especificidades. Grande parte do nosso sistema no iSeries teria sido impossível sem JNI. Então, sim, JNI tem o seu lugar, e quando você precisar dele, você realmente precisa.

É relativamente difícil (ao lado de puro Java), mas poderoso e não horrível.

Além disso, sempre que eu estou olhando para algum código JNI, eu também considerar o uso JNA .

Eu posso pensar de alguns usos em cima da minha cabeça:

  1. integração com baixo nível existente (C / C ++) APIs que não têm um Java contraparte
  2. integração com aspectos do sistema que não estão expostos através de APIs Java disponíveis (direto acesso ao hardware, etc.)

Alguns poderiam dizer que pode ser útil para criar seções altamente otimizadas de código porém com JVMs modernas que você está recebendo muito rápido e as complicações do uso de JNI provavelmente superam qualquer benefício de desempenho que você pode ver.

Há alguns usos para ligação a FFmpeg para C-decodificação de (droga perto de qualquer) formato de vídeo / áudio.

Há também JNA, o que o torna como você está usando a própria biblioteca. Este é "mais fácil" do ponto de vista que ele passa tudo para o desenvolvedor Java para gerenciar, e mais difícil no sentido de que você tem que descobrir o mapeamento estrutura e fazer um monte de trabalho duro para obter todos os ponteiros, etc, para passar corretamente.

Nós tivemos um requisito para embrulhar uma nova interface do usuário em torno de um aplicativo herdado C rodando em Suse Linux. JNI foi a ferramenta perfeita para o trabalho.

Em geral, eu acho JNI é uma contradição com a noção Java de wora. No entanto, existem casos de uso onde JNI podem ser úteis.

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