Saat memainkan puzzle ini (Ini adalah game trivia kata kunci Java), saya menemukan native
kata kunci.
Untuk apa kata kunci asli di Jawa digunakan?
java
java-native-interface
native
keyword
angin puyuh
sumber
sumber
Jawaban:
Kata
native
kunci diterapkan pada metode untuk menunjukkan bahwa metode ini diterapkan dalam kode asli menggunakan JNI (Java Native Interface).sumber
Contoh runnable minimal
Main.java
Main.c
Kompilasi dan jalankan:
Keluaran:
Diuji pada Ubuntu 14.04 AMD64. Juga bekerja dengan Oracle JDK 1.8.0_45.
Contoh di GitHub untuk Anda mainkan.
Menggarisbawahi dalam paket Java / nama file harus lolos dengan
_1
dalam nama fungsi C seperti yang disebutkan di: Memanggil fungsi JNI dalam nama paket Android yang berisi garis bawahPenafsiran
native
memungkinkan Anda untuk:Ini dapat digunakan untuk:
dengan tradeoff portabilitas yang lebih rendah.
Dimungkinkan juga bagi Anda untuk memanggil Java dari C, tetapi Anda harus terlebih dahulu membuat JVM di C: Bagaimana cara memanggil fungsi Java dari C ++?
API ekstensi asli yang analog juga ada di banyak "bahasa VM" lainnya untuk alasan yang sama, misalnya Python , Node.js , Ruby .
Android NDK
Konsepnya persis sama dalam konteks ini, kecuali bahwa Anda harus menggunakan Android boilerplate untuk memasangnya.
Repositori resmi NDK berisi contoh-contoh "kanonik" seperti aplikasi hello-jni:
Dalam Anda
unzip
seorang.apk
dengan NDK di Android O, Anda dapat melihat pre-compiled.so
yang sesuai dengan kode asli di bawahlib/arm64-v8a/libnative-lib.so
.TODO mengkonfirmasi: lebih jauh,,
file /data/app/com.android.appname-*/oat/arm64/base.odex
mengatakan itu adalah pustaka bersama, yang saya pikir adalah AOT yang telah dikompilasi .dex yang sesuai dengan file Java dalam ART, lihat juga: Apakah file ODEX di Android? Jadi mungkin Java sebenarnya juga dijalankan melaluinative
antarmuka?Contoh di OpenJDK 8
Mari kita temukan cari di mana
Object#clone
didefinisikan dalam jdk8u60-b27.Kami akan menyimpulkan bahwa itu dilaksanakan dengan
native
panggilan.Pertama kita temukan:
yang membawa kita ke jdk / src / share / classes / java / lang / Object.java # l212 :
Sekarang sampai pada bagian yang sulit, menemukan di mana klon berada di tengah semua tipuan. Permintaan yang membantu saya adalah:
yang akan menemukan file C atau C ++ yang mungkin mengimplementasikan metode asli Object. Ini menuntun kita ke jdk / share / asli / java / lang / Object.c # l47 :
yang membawa kita ke
JVM_Clone
simbol:yang membawa kita ke hotspot / src / share / vm / prims / jvm.cpp # l580 :
Setelah memperluas sekelompok makro, kami sampai pada kesimpulan bahwa ini adalah titik definisi.
sumber
static
native
metode Java, parameter kedua dari fungsi C ++ adalah tipejclass
dan bukanjobject
.Itu menandai metode, bahwa itu akan diimplementasikan dalam bahasa lain, bukan di Jawa. Ini bekerja bersama-sama dengan JNI (Java Native Interface).
Metode asli digunakan di masa lalu untuk menulis bagian kritis kinerja tetapi dengan Java semakin cepat ini sekarang kurang umum. Metode asli saat ini diperlukan ketika
Anda perlu memanggil perpustakaan dari Jawa yang ditulis dalam bahasa lain.
Anda perlu mengakses sumber daya sistem atau perangkat keras yang hanya dapat dijangkau dari bahasa lain (biasanya C). Sebenarnya, banyak fungsi sistem yang berinteraksi dengan komputer nyata (disk dan IO jaringan, misalnya) hanya dapat melakukan ini karena mereka memanggil kode asli.
Lihat Juga Spesifikasi Antarmuka Asli Java
sumber
currentTimeMillis
adalah bagian dari JDK dan mereka dijelaskan dengannative
karena implementasi ada dalam kode sumber JDK itu sendiri. Sangat tidak mungkin implementasi menggunakan bahasa assembly; mungkin memanggil metode API dari sistem operasi yang menjalankan JVM di atas. Sebagai contoh pada Windows, ia dapat memanggil metode DLLGetSystemTime
di kernel32.dll. Pada OS lain itu akan memiliki implementasi yang berbeda. Namun ketika Anda menggunakannative
untuk metode yang Anda tulis (sebagai lawan dari metode JDK) Anda harus menyediakan implementasi menggunakan JNI.currentTimeMillis
ditandai sebagai aslijava.lang.System
sehingga menggunakan JNI, bukankah begitu?Langsung dari para Jawa Bahasa Spesifikasi :
sumber
Saat SLaks menjawab,
native
kata kunci untuk memanggil kode asli.Ini juga digunakan oleh GWT untuk menerapkan metode javascript.
sumber
fungsi yang mengimplementasikan kode asli dinyatakan sebagai asli.
http://en.wikipedia.org/wiki/Java_Native_Interface
sumber
NATIVE adalah Non access modifier.it hanya dapat diterapkan ke METHOD. Ini menunjukkan implementasi metode atau kode PLATFORM-DEPENDENT.
sumber
asli adalah kata kunci dalam java, yang digunakan untuk membuat struktur (metode) yang tidak diimplementasikan seperti abstrak tetapi akan menjadi platform yang bergantung seperti kode asli dan dieksekusi dari tumpukan asli bukan tumpukan java.
sumber
native
adalah kata kunci dalam java, ini menunjukkan platform dependen.native
metode bertindak sebagai antarmuka antara Java ( JNI ) dan bahasa pemrograman lainnya.sumber
native
Metode Java menyediakan mekanisme untuk kode Java untuk memanggil kode asli OS, baik karena alasan fungsional atau kinerja.Contoh:
Dalam
Runtime.class
file yang sesuai di OpenJDK, terletak diJAVA_HOME/jmods/java.base.jmod/classes/java/lang/Runtime.class
, berisi metode ini dan memberi tag mereka denganACC_NATIVE
(0x0100
), dan metode ini tidak mengandung atribut Code , yang berarti metode ini tidak memiliki logika koding yang sebenarnya dalamRuntime.class
file:availableProcessors
: ditandai sebagai bawaan dan tanpa atribut KodefreeMemory
: ditandai sebagai bawaan dan tanpa atribut KodetotalMemory
: ditandai sebagai bawaan dan tanpa atribut KodemaxMemory
: ditandai sebagai bawaan dan tanpa atribut Kodegc
: ditandai sebagai bawaan dan tanpa atribut KodeLogika pengkodean sebenarnya ada di file Runtime.c yang sesuai :
Dan
C
pengkodean ini dikompilasi ke dalam filelibjava.so
(Linux) ataulibjava.dll
(Windows), yang terletak diJAVA_HOME/jmods/java.base.jmod/lib/libjava.so
:Referensi
sumber