CodeBlanks Logo Icon CodeBlanks

Özet - JNI

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

Main.java
// 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

Main.java
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

Main.java
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

Main.java
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

Uzman bölümündeki tüm dersler