CodeBlanks Logo Icon CodeBlanks

C/C++ ile uygulama

C/C++ ile JNI uygulamasını öğrenirsin.

JNI tür eşlemesi

JNI, Java türlerini C tarafında kullanılan imza harfleriyle gösterir: int → I, long → J, boolean → Z, void → V, String → Ljava/lang/String;. Metot imzası (parametreler)dönüş biçimindedir.

Örnek: int sum(int a, int b) metodunun imzası (II)I'dir. Bu imzalar javap -s ile de görülebilir ve aşırı yükleme için C işlev adına eklenir.

Yerel kütüphane yükleme

Bir native metodu çağırmadan önce yerel kütüphane yüklenmelidir: System.loadLibrary("nativeops");. Bu çağrı genelde static blokta yapılır; böylece sınıf yüklenirken kütüphane hazır hale gelir. Kütüphane java.library.path üzerinde aranır.

Kütüphane bulunamazsa UnsatisfiedLinkError fırlatılır. Çok platformlu projelerde her işletim sistemi için ayrı kütüphane derlenir.

Uygulama tür eşleyici ve native sınıfı yaz

class TypeMapper tanımla; static String jni(String t) metodu bir switch ile int → "I", long → "J", boolean → "Z", void → "V" döndürsün. class NativeOps tanımla; native int sum(int a, int b); ve static blokta System.loadLibrary("nativeops"); çağrısı olsun (try ile sar). main içinde System.out.println("(" + TypeMapper.jni("int") + TypeMapper.jni("int") + ")" + TypeMapper.jni("int")); yazdır.

Başlangıç kodu

Main.java
// TypeMapper sınıfını tanımla: static String jni(String t) switch ile I/J/Z/V döndürsün
// NativeOps sınıfını tanımla: native int sum(int a, int b) ve static blokta System.loadLibrary

// main: (II)I imzasını yazdır

Örnek çözüm

Main.java
class TypeMapper {
    static String jni(String t) {
        return switch (t) {
            case "int" -> "I";
            case "long" -> "J";
            case "boolean" -> "Z";
            case "void" -> "V";
            default -> "?";
        };
    }
}

class NativeOps {
    native int sum(int a, int b);
    static {
        try { System.loadLibrary("nativeops"); } catch (UnsatisfiedLinkError e) { }
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("(" + TypeMapper.jni("int") + TypeMapper.jni("int") + ")" + TypeMapper.jni("int"));
    }
}

Beklenen çıktı

(II)I

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 int türünün JNI imza harfi nedir?

  • I Doğru cevap
  • J
  • Z
  • L

Açıklama: int türü JNI imzasında I harfiyle gösterilir.

2 metot imzasını tamamla

Soru
String sig = "(____";
Cevap
String sig = "(II)I";

Açıklama: (II)I imzası int sum(int, int) anlamına gelir.

3 tür eşlemesini eşleştir

Kavram Anlamı
int I
long J
boolean Z
String Ljava/lang/String;

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