Enquanto jogava esse quebra-cabeça (é um jogo de trivia de palavras-chave em Java), me deparei com a native
palavra - chave.
Para que é usada a palavra-chave nativa em Java?
java
java-native-interface
native
keyword
turbilhão
fonte
fonte
Respostas:
A
native
palavra-chave é aplicada a um método para indicar que o método é implementado no código nativo usando JNI (Java Native Interface).fonte
Exemplo mínimo executável
Main.java
Main.c
Compile e execute:
Resultado:
Testado no Ubuntu 14.04 AMD64. Também trabalhou com o Oracle JDK 1.8.0_45.
Exemplo no GitHub para você brincar.
Os sublinhados nos nomes de pacotes / arquivos Java devem ser escapados
_1
no nome da função C, conforme mencionado em: Chamando Funções JNI no nome do pacote Android que contém sublinhadoInterpretação
native
permite que você:Isso pode ser usado para:
com a troca de menor portabilidade.
Também é possível chamar Java de C, mas você deve primeiro criar uma JVM em C: Como chamar funções Java de C ++?
APIs de extensão nativas análogas também estão presentes em muitas outras "linguagens de VM" pelos mesmos motivos, por exemplo , Python , Node.js , Ruby .
Android NDK
O conceito é exatamente o mesmo neste contexto, exceto que você precisa usar o clichê do Android para configurá-lo.
O repositório oficial do NDK contém exemplos "canônicos", como o aplicativo hello-jni:
Em
unzip
um.apk
NDK no Android O, é possível ver o pré-compilado.so
que corresponde ao código nativo emlib/arm64-v8a/libnative-lib.so
.TODO confirma: além disso,
file /data/app/com.android.appname-*/oat/arm64/base.odex
diz que é uma biblioteca compartilhada, que eu acho que é o .dex pré-compilado AOT correspondente aos arquivos Java no ART, veja também: O que são arquivos ODEX no Android? Talvez o Java também seja executado através de umanative
interface?Exemplo no OpenJDK 8
Vamos encontrar onde
Object#clone
é definido em jdk8u60-b27.Concluiremos que é implementado com uma
native
chamada.Primeiro encontramos:
o que nos leva a jdk / src / share / classes / java / lang / Object.java # l212 :
Agora vem a parte difícil, descobrir onde o clone está em meio a toda a indireção. A consulta que me ajudou foi:
que encontraria arquivos C ou C ++ que podem implementar os métodos nativos do Object. Isso nos leva ao jdk / share / native / java / lang / Object.c # l47 :
o que nos leva ao
JVM_Clone
símbolo:o que nos leva ao hotspot / src / share / vm / prims / jvm.cpp # l580 :
Depois de expandir um monte de macros, chegamos à conclusão de que esse é o ponto de definição.
fonte
static
native
método Java, o segundo parâmetro da função C ++ é do tipojclass
e nãojobject
.Ele marca um método, que será implementado em outras linguagens, não em Java. Ele trabalha em conjunto com o JNI (Java Native Interface).
Métodos nativos foram usados no passado para escrever seções críticas de desempenho, mas com o Java ficando mais rápido, isso agora é menos comum. Atualmente, métodos nativos são necessários quando
Você precisa chamar uma biblioteca de Java escrita em outra linguagem.
Você precisa acessar os recursos do sistema ou hardware acessíveis somente a partir de outro idioma (normalmente C). Na verdade, muitas funções do sistema que interagem com o computador real (E / S de disco e rede, por exemplo) só podem fazer isso porque chamam código nativo.
Consulte também Especificação da interface nativa Java
fonte
currentTimeMillis
fazem parte do JDK e são anotadosnative
porque a implementação está no próprio código-fonte do JDK. É muito improvável que a implementação use linguagem assembly; provavelmente chama um método API do sistema operacional no qual a JVM está sendo executada. Por exemplo, no Windows, ele pode chamar um método DLLGetSystemTime
no kernel32.dll. Em outro sistema operacional, ele terá uma implementação diferente. No entanto, ao usarnative
um método que você está escrevendo (em oposição a um método JDK), é necessário fornecer a implementação usando JNI.currentTimeMillis
está marcado como nativojava.lang.System
para usar JNI, não é?Straight from a especificação Java Idioma :
fonte
Como SLaks respondeu, o
native
palavra-chave é para chamar código nativo.Também é usado pelo GWT para implementar métodos javascript.
fonte
funções que implementam código nativo são declaradas nativas.
http://en.wikipedia.org/wiki/Java_Native_Interface
fonte
NATIVE é Modificador sem acesso. Só pode ser aplicado a METHOD. Indica a implementação do método ou código PLATAFORMA-DEPENDENTE.
fonte
native é uma palavra-chave em java, usada para tornar a estrutura (método) não implementada como abstrata, mas seria dependente da plataforma, como código nativo, e executada a partir da pilha nativa e não da pilha java.
fonte
native
é uma palavra-chave em java, indica dependente da plataforma.native
métodos são atos como interface entre Java ( JNI ) e outras linguagens de programação.fonte
O
native
método Java fornece um mecanismo para o código Java chamar o código nativo do SO, devido a razões funcionais ou de desempenho.Exemplo:
No
Runtime.class
arquivo correspondente no OpenJDK, localizado emJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, contém esses métodos e os marcou comACC_NATIVE
(0x0100
), e esses métodos não contêm o atributo Code , o que significa que esse método não possui nenhuma lógica de codificação real noRuntime.class
arquivo:availableProcessors
: marcado como atributo nativo e sem códigofreeMemory
: marcado como atributo nativo e sem códigototalMemory
: marcado como atributo nativo e sem códigomaxMemory
: marcado como atributo nativo e sem códigogc
: marcado como atributo nativo e sem códigoA lógica de codificação de fato está no arquivo Runtime.c correspondente :
E essa
C
codificação é compilada no arquivolibjava.so
(Linux) oulibjava.dll
(Windows), localizado emJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Referência
fonte