- JNI, JVM kodunun yerel C veya C++ fonksiyonlarını çağırmasına ve yerel kodun Java'ya geri çağırmasına olanak tanıyan yerleşik arayüzdür.
- Bir
nativemetodunun Java gövdesi yoktur; JVM, çalışma zamanında derlenmiş bir fonksiyona bağlar. - Programlar, yerel kütüphaneleri yeniden kullanmak, işletim sistemine erişmek, sık kullanılan yolları hızlandırmak veya donanımla etkileşim kurmak için bunu kullanır.
- Sınır nettir: yerel çökmeler JVM'yi çökletebilir ve yerel derlemeler platforma özgüdür.
JNI, Java Yerel Arayüzü'dür; Java'nın yerleşik bir parçası olup, JVM üzerinde çalışan kodun C veya C++ ile yazılmış fonksiyonları çağırmasına ve bu yerel kodun Java'ya geri çağrı yapmasına olanak tanır. Bir Java programının JVM'nin dışına uzanarak bir platform kütüphanesini veya derlenmiş makine kodu parçasını kullanmasının yoludur.
Opal Nerede Çalışır
Opal, bir Fabric modudur, bu yüzden çoğunluğu düz Java'dır ve JavaScript ile kodlama yaparsınız, yerel kodu elle değiştirmeniz gerekmez. Başlamak için kurulum rehberine göz atın.
JNI Ne İşe Yarar
JNI, iki dünyayı birbirine bağlar: JVM üzerindeki yönetilen Java kodu ve makine talimatlarına derlenmiş yerel kodu. Bir Java metodu native olarak işaretlenir ve Java'da gövdesi bulunmaz. Çalışma zamanında JVM, yerel bir kütüphane yükler ve bu metodu eşleşen bir C veya C++ fonksiyonuyla ilişkilendirir. Ardından iki taraf, argümanları ve değerleri karşılıklı olarak iletir.
Yerel taraf bir JNIEnv işaretçisi alır. Bu tanıtıcı kapıdır: Java alanlarını okumak, Java metotlarını çağırmak, nesneler oluşturmak ve istisnalar fırlatmak için fonksiyonları açığa çıkarır. Böylece köprü tek yönlü değil, her iki yönde de çalışır.
Bir Program Neden Kullanır
Çoğu Java kodu JNI'ye ihtiyaç duymaz. Bir program, birkaç durumda ona uzanır:
- Mevcut yerel kodu yeniden kullanmak. Olgun bir C veya C++ kütüphanesi zaten işi yapıyor ve onu Java'da yeniden yazmak değmez.
- İşletim sistemine ulaşmak. Bazı platform özelliklerinin saf Java API'si yoktur, bu nedenle yerel bir çağrı tek yoldur.
- Sıcak bir yolda hız. Sıkı bir sayısal veya düşük seviyeli rutin, JVM'de olduğundan daha hızlı derlenmiş yerel kod olarak çalışabilir.
- Donanım veya sürücülere dokunmak. Grafik, ses ve cihaz erişimi genellikle yerel kütüphanelerin arkasında yaşar.
Bir JNI Çağrısı Nasıl Çalışır
Adımlar her platformda aynıdır.
| Adım | Olay |
|---|---|
| Bildir | Bir Java metodu, native anahtar kelimesiyle yazılır ve gövdesi olmaz. |
| Oluştur | Bir C veya C++ fonksiyonu, çalışma zamanında kullanılabilen bir paylaşımlı kütüphaneye (.dll, .so, .dylib) derlenir. |
| Yükle | Java, çalışma zamanında bu kütüphaneyi yüklemek için System.loadLibrary'yi çağırır. |
| Bağla | JVM, native metodunu, adıyla C fonksiyonuna eşler. |
| Çağır | Java metodu çağırır; kontrol yerel koda geçer ve geri döner. |
Fonksiyon adları, JVM'nin bunları bulabilmesi için sabit bir kalıbı takip eder ve oluşturulan başlık, uygulanacak kesin imzayı size bildirir.
Maliyetler ve riskler
JNI güçlüdür ancak keskin kenarları vardır. Yerel kodda bir çökme, JVM'nin tamamını düşürebilir çünkü bu kod JVM'nin güvenlik ağı dışında çalışır. Yerel tarafın ayırdığı bellek çöp toplama işlemine tabi olmadığından, sızıntılar kolayca oluşabilir. Java ve yerel kod arasında yapılan her geçişte ek yük vardır, bu nedenle sıkı bir döngüde sınırı aşmak yavaş olabilir. Ve yerel kütüphaneler platforma özeldir: Windows için oluşturulan bir derleme, ayrı bir derleme olmadan Linux'ta çalışmaz.
Dikkatli kullanın
Yerel sınır, JVM'nin güvenlik garantilerini atladığı için, JNI yalnızca saf Java ile çözülemeyen durumlarda başvurulan bir araçtır. Çoğu mod, Opal dahil, buna hiç ihtiyaç duymaz.
Sıkça Sorulan Sorular
Evet. JNI, JDK ve JVM ile birlikte gelir. Java tarafında ek bir şey yüklemenize gerek olmasa da, C veya C++ kısmını derlemek için yerel bir araç zincirine ihtiyacınız vardır.
Hayır. Java tarafı taşınabilirliğini korur, ancak yerel kütüphane bir işletim sistemi ve CPU için derlenir, bu nedenle her platform için ayrı bir yerel derleme dağıtmanız gerekir.
Hayır. Orijinal, yerleşik yöntemdir. Daha yeni Java sürümleri, daha güvenli ve kullanımı daha kolay olmayı hedefleyen daha modern bir yabancı fonksiyon API'si ekler, ancak JNI hala yaygın olarak kullanılmakta ve iyi anlaşılmaktadır.
Çoğunlukla Java ile yazılmış bir istemci, JVM'nin doğrudan yapamadığı bir şey için bazen yerel bir kütüphaneye ihtiyaç duyar. JNI, bu kütüphaneyi yüklemek ve çağırmak için standart köprüdür.