Podczas gry tę łamigłówkę (jest to gra z ciekawostkami Java), natrafiłem na native
słowo kluczowe.
Do czego służy rodzime słowo kluczowe w Javie?
Podczas gry tę łamigłówkę (jest to gra z ciekawostkami Java), natrafiłem na native
słowo kluczowe.
Do czego służy rodzime słowo kluczowe w Javie?
Odpowiedzi:
Słowo
native
kluczowe jest stosowane do metody, aby wskazać, że metoda jest zaimplementowana w kodzie natywnym przy użyciu JNI (Java Native Interface).źródło
Minimalny możliwy do uruchomienia przykład
Main.java
Main.c
Skompiluj i uruchom:
Wynik:
Testowany na Ubuntu 14.04 AMD64. Współpracował również z Oracle JDK 1.8.0_45.
Przykład na GitHub, z którym możesz grać.
Podkreślenia w nazwach pakietów / plików Java muszą być poprzedzane znakami ucieczki
_1
w nazwie funkcji C, jak wspomniano w: Wywoływanie funkcji JNI w nazwie pakietu Android zawierającej podkreślenieInterpretacja
native
pozwala Ci na:Można to wykorzystać do:
z kompromisem niższej przenośności.
Możliwe jest również wywoływanie Java z C, ale najpierw musisz utworzyć JVM w C: Jak wywoływać funkcje Java z C ++?
Android NDK
W tym kontekście koncepcja jest dokładnie taka sama, z tym wyjątkiem, że do jej skonfigurowania trzeba użyć podstawki Android.
Oficjalne repozytorium NDK zawiera „kanoniczne” przykłady, takie jak aplikacja hello-jni:
W was
unzip
na.apk
z NDK na Androida O, widać skompilowane.so
który odpowiada natywnego kodu podlib/arm64-v8a/libnative-lib.so
.TODO potwierdź: co więcej,
file /data/app/com.android.appname-*/oat/arm64/base.odex
mówi, że jest to biblioteka współdzielona, która, jak myślę, jest wstępnie skompilowaną AOT .dex odpowiadającą plikom Java w ART, zobacz także: Co to są pliki ODEX w Androidzie? Więc może Java jest również uruchamiana przeznative
interfejs?Przykład w OpenJDK 8
Znajdźmy gdzie
Object#clone
jest zdefiniowany w jdk8u60-b27.Dochodzimy do wniosku, że jest on realizowany za pomocą
native
połączenia.Najpierw znajdujemy:
co prowadzi nas do jdk / src / share / klas / java / lang / Object.java # l212 :
Teraz przychodzi trudna część, znalezienie miejsca, w którym klon znajduje się pośród całej pośrednictwa. Zapytanie, które mi pomogło, to:
który znalazłby pliki C lub C ++, które mogłyby implementować rodzime metody Object. Prowadzi nas do jdk / share / native / java / lang / Object.c # l47 :
co prowadzi nas do
JVM_Clone
symbolu:co prowadzi nas do hotspot / src / share / vm / prims / jvm.cpp # l580 :
Po rozwinięciu kilku makr dochodzimy do wniosku, że jest to punkt definicji.
źródło
static
native
metody Java drugi parametr funkcji C ++ jest typu,jclass
a nie typujobject
.Oznacza metodę, że zostanie zaimplementowana w innych językach, a nie w Javie. Współpracuje z JNI (Java Native Interface).
W przeszłości używane były metody rodzime do pisania sekcji krytycznych pod względem wydajności, ale wraz z przyspieszeniem Javy jest to obecnie mniej powszechne. Metody rodzime są obecnie potrzebne, gdy
Musisz wywołać bibliotekę z Java napisaną w innym języku.
Musisz uzyskać dostęp do zasobów systemowych lub sprzętowych, które są dostępne tylko z innego języka (zazwyczaj C). W rzeczywistości wiele funkcji systemowych, które współdziałają z rzeczywistym komputerem (na przykład dyskowe i sieciowe IO), może to zrobić tylko dlatego, że wywołują kod natywny.
Zobacz także specyfikację Java Native Interface
źródło
currentTimeMillis
są częścią JDK i są opatrzone adnotacjami,native
ponieważ implementacja jest w samym kodzie źródłowym JDK. Jest bardzo mało prawdopodobne, że implementacja używa języka asemblera; prawdopodobnie wywołuje metodę API systemu operacyjnego, na którym działa JVM. Na przykład w systemie Windows może wywoływać metodę DLLGetSystemTime
w pliku kernel32.dll. W innym systemie operacyjnym będzie miał inną implementację. Jednak jeśli używasznative
metody, którą piszesz (w przeciwieństwie do metody JDK), musisz podać implementację za pomocą JNI.currentTimeMillis
jest oznaczony jako natywny,java.lang.System
więc używa JNI, prawda?Prosto z tym Java Language Specification :
źródło
W odpowiedzi na SLaks
native
słowo kluczowe służy do wywoływania kodu natywnego.Używał go także GWT do implementacji metod javascript.
źródło
funkcje implementujące kod macierzysty są deklarowane jako rodzime.
http://en.wikipedia.org/wiki/Java_Native_Interface
źródło
NATIVE jest modyfikatorem braku dostępu. Można go stosować tylko do METODY. Wskazuje implementację metody lub kodu w zależności od PLATFORMY.
źródło
native jest słowem kluczowym w java, które służy do tego, aby niezaimplementowana struktura (metoda) była jak abstrakcyjna, ale byłaby zależna od platformy, takiej jak kod natywny i wykonywana ze stosu natywnego, a nie stosu java.
źródło
native
jest słowem kluczowym w Javie, oznacza zależne od platformy.native
metody działają jako interfejs między Javą ( JNI ) a innymi językami programowania.źródło
Jawa
native
Metoda zapewnia mechanizm wywoływania przez kod Java natywnego kodu systemu operacyjnego z powodów funkcjonalnych lub wydajnościowych.Przykład:
W odpowiednim
Runtime.class
pliku w OpenJDK, znajdującym się wJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, zawiera te metody i oznacza je za pomocąACC_NATIVE
(0x0100
), a metody te nie zawierają atrybutu Code , co oznacza, że metody te nie mają żadnej logiki kodowania wRuntime.class
pliku:availableProcessors
: oznaczona jako natywna i bez atrybutu KodfreeMemory
: oznaczona jako natywna i bez atrybutu KodtotalMemory
: oznaczona jako natywna i bez atrybutu KodmaxMemory
: oznaczona jako natywna i bez atrybutu Kodgc
: oznaczona jako natywna i bez atrybutu KodW rzeczywistości logika kodowania znajduje się w odpowiednim pliku Runtime.c :
A te
C
kodowanie jest kompilowany dolibjava.so
(Linux) lublibjava.dll
pliku (Windows), znajduje się naJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Odniesienie
źródło