Özet - JNI
- Java kursu
- Uzman
- Ders 30/46
- 5 dk
native ve JNIEnv'i birleştirerek bir matematik yerel bağlaması yazarsın.
Özet - JNI
Bu grupta Java'ya nasıl yerel kod bağlayacağını öğrendin. native ile gövdesiz metot bildirirsin; javac -h ile C başlığını üretirsin; JNIEnv* üzerinden C tarafından JVM'e erişirsin; System.loadLibrary ile kütüphaneyi yüklersin.
Tür eşlemesi (int → I) ve C işlev adlandırması (Java_Sınıf_metot) JNI'nin temelidir. Modern Java 21'de ise FFM API daha güvenli ve önerilen yoldur.
Uygulama JNI bağlayıcı sınıfını yaz
class JniBinder tanımla; String javaName ve String signature alanları ve bunları atayan JniBinder(String javaName, String signature) yapıcısı olsun. String cName() metodu "Java_" + javaName.replace(".", "_") döndürsün. main içinde JniBinder b = new JniBinder("NativeOps.sum", "(II)I"); oluştur ve System.out.println(b.cName() + " " + b.signature); yazdır.
Başlangıç kodu
// JniBinder sınıfını tanımla: javaName, signature alanları, yapıcı ve cName metodu
// main: bir JniBinder oluştur ve cName ile signature yazdırÖrnek çözüm
class JniBinder {
String javaName;
String signature;
JniBinder(String javaName, String signature) {
this.javaName = javaName;
this.signature = signature;
}
String cName() {
return "Java_" + javaName.replace(".", "_");
}
}
public class Main {
public static void main(String[] args) {
JniBinder b = new JniBinder("NativeOps.sum", "(II)I");
System.out.println(b.cName() + " " + b.signature);
}
}Beklenen çıktı
Java_NativeOps_sum (II)I
Ne öğrendin?
Artık bir native metodu bildirip başlığını üretebilir, C işlev adını oluşturabilir ve tür imzasını çıkarabilirsin. System.loadLibrary ile kütüphaneyi yükler, hata durumunu try ile yakalarsın.
Yeni projelerde JNI yerine FFM API tercih edilir; ancak var olan C kütüphaneleri JNI gerektirir. İki yolu da tanımanın tam zamanı birleştirme görevi.
Uygulama JniBinder'a describe metodu ekle
Üstteki JniBinder sınıfına String describe() metodu ekle; cName() + " " + signature döndürsün. main içinde System.out.println(b.describe()); ile yazdır.
Başlangıç kodu
class JniBinder {
String javaName;
String signature;
JniBinder(String javaName, String signature) {
this.javaName = javaName;
this.signature = signature;
}
String cName() {
return "Java_" + javaName.replace(".", "_");
}
}
public class Main {
public static void main(String[] args) {
JniBinder b = new JniBinder("NativeOps.sum", "(II)I");
System.out.println(b.cName() + " " + b.signature);
}
}Örnek çözüm
class JniBinder {
String javaName;
String signature;
JniBinder(String javaName, String signature) {
this.javaName = javaName;
this.signature = signature;
}
String cName() {
return "Java_" + javaName.replace(".", "_");
}
String describe() {
return cName() + " " + signature;
}
}
public class Main {
public static void main(String[] args) {
JniBinder b = new JniBinder("NativeOps.sum", "(II)I");
System.out.println(b.describe());
}
}Beklenen çıktı
Java_NativeOps_sum (II)I
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Modern Java'da JNI'ye alternatif nedir?
- RMI
- Reflection
- FFM API Doğru cevap
- Serialization
Açıklama: FFM API, Java 21'de JNI'ye modern alternatiftir.
2 kavramları özetle
| Kavram | Anlamı |
|---|---|
native |
Gövdesiz metot |
javac -h |
Başlık üretimi |
JNIEnv |
C arabirimi |
FFM API |
Modern alternatif |