Visão Geral de JNI
Do ponto de vista de uma JVM, há dois tipos de código: "Java™" e "native". A Java Native Interface (JNI) estabelece uma interface bem definida e independente de plataforma entre os dois.
O código nativo pode ser usado junto com Java de duas maneiras distintas: como "métodos nativos" em uma JVM em execução e como o código que cria uma JVM usando a "API de Chamada". Esta seção descreve a diferença.
Métodos Nativos
Os métodos nativos Java são declarados em Java, implementados em outra linguagem (como C ou C + +) e carregados pela JVM conforme necessário. Para usar métodos nativos, deve-se:
- Declare o método nativo em seu código Java
Quando o compilador javac encontra uma declaração de método nativo no código fonte Java, ele registra o nome e os parâmetros para o método. Como o código fonte Java não contém implementação, o compilador marca o método como "nativo". A JVM pode então resolver o método corretamente quando for chamada.
- Implementar o método nativo.
Os métodos nativos são implementados como pontos de entrada externos em uma biblioteca binária carregável. O conteúdo de uma biblioteca nativa é específico da plataforma. A JNI fornece uma maneira para que a JVM use quaisquer métodos nativos em uma maneira independente de plataforma.
A JVM executa chamadas a métodos nativos. Quando a JVM está em um método nativo, a JNI fornece uma maneira de "retornar chamada" à JVM.
- Carregar o código de método nativo para a VM usar.
Bem como declarar o método nativo, deve-se localizar e carregar a biblioteca nativa que contém o método no tempo de execução.
Duas interfaces Java carregaram bibliotecas nativas:
- java.lang.System.load()
- java.lang.System.loadLibrary()
Geralmente, uma classe que declara métodos nativos carrega a biblioteca nativa em seu inicializador estático.
API de Chamada
A criação de uma JVM envolve código nativo. O aspecto da JNI usada para esse propósito é chamado de API de Chamada da JNI. Para usar a API de Chamada, você se liga a uma biblioteca compartilhada específica da implementação, de forma estática ou dinâmica, e chama as funções JNI_* que ela exporta.
A Especificação e Implementação da JNI
A especificação da JNI é vaga em detalhes selecionados da implementação. Ela fornece uma estrutura reutilizável para interfaces nativas C e C++ simples e extensíveis. O modelo da JNI também é a base para a especificação da JVMTI.
A especificação de marca registrada do Oracle Corporation e o Java Compatibility Kit (JCK) asseguram a conformidade com a especificação, mas não com a implementação O código nativo deve estar em conformidade com a especificação e não com a implementação. Código gravado com relação ao comportamento não especificado está fadado a problemas de portabilidade e compatibilidade com versões mais recentes.