0Pricing
Java Academy · Ders

Downcall Tanıtıcıları

Yerel işlevleri çağırın

Downcall Tanıtıcıları, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

Yerel İşlevleri Çağırma

Aşağı çağrı, Java'dan yerel koda yapılan bir çağrıdır. FFM, her yerel işlevi bir Linker kullanılarak oluşturulan MethodHandle olarak temsil eder.

Bu derste bir C işlevini bulma, açıklama ve çağırma adımları ele alınır.

Yerel Bağlayıcı

Linker.nativeLinker(), çalışan platform için bağlayıcıyı döndürür. C çağrı kuralını bilir ve yerel işlevler için tutamaçlar üretebilir.

import java.lang.foreign.Linker;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        System.out.println("Got native linker: " + linker);
    }
}

Simge Bulma

İşlevin adresine ihtiyacınız vardır. linker.defaultLookup() standart C kitaplığında arama yapar; SymbolLookup.libraryLookup(name, arena) ise belirli bir paylaşılan kitaplığı yükler.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        SymbolLookup stdlib = linker.defaultLookup();
        MemorySegment addr = stdlib.find("strlen").orElseThrow();
        System.out.println("strlen address found: " + addr);
    }
}

İmzayı Açıklama

Bir FunctionDescriptor, C imzasını yerleşimler cinsinden açıklar. size_t strlen(const char*) için dönüş türü uzun tamsayıdır ve bağımsız değişken bir işaretçidir (ADDRESS).

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        FunctionDescriptor desc = FunctionDescriptor.of(
            ValueLayout.JAVA_LONG,   // return: size_t
            ValueLayout.ADDRESS);    // arg: const char*
        System.out.println("Descriptor: " + desc);
    }
}

Tutamaç Oluşturma

Simge ile tanımlayıcıyı downcallHandle kullanarak birleştirip herhangi bir Java yöntemi gibi çağırabileceğiniz bir MethodHandle elde edersiniz.

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {
    public static void main(String[] args) {
        Linker linker = Linker.nativeLinker();
        MethodHandle strlen = linker.downcallHandle(
            linker.defaultLookup().find("strlen").orElseThrow(),
            FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
        System.out.println("Handle ready: " + strlen.type());
    }
}

İşlevi Çağırma

strlen işlevini çağırmak için yerel bir dizeye işaretçi geçirirsiniz. Dizeyi bir arena içinde ayırın, ardından tutamacı invoke edin. Sonuç Java'daki uzun tamsayı olarak döner.

import java.lang.foreign.*;
import java.lang.invoke.MethodHandle;

public class Main {
    public static void main(String[] args) throws Throwable {
        Linker linker = Linker.nativeLinker();
        MethodHandle strlen = linker.downcallHandle(
            linker.defaultLookup().find("strlen").orElseThrow(),
            FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS));
        try (Arena arena = Arena.ofConfined()) {
            MemorySegment str = arena.allocateUtf8String("Hello, FFM");
            long len = (long) strlen.invoke(str);
            System.out.println("Length = " + len);
        }
    }
}

Türleri Eşleme

Her C türü bir yerleşimle eşlenir:

  • int ile ValueLayout.JAVA_INT
  • long/size_t ile JAVA_LONG
  • double ile JAVA_DOUBLE
  • her işaretçi ile ADDRESS

Çağrının verileri bozmaması için bu eşlemeleri doğru yapmak zorunludur.

İşaretçi Döndüren İşlevler

Bir C işlevi işaretçi döndürdüğünde, tutamaç sıfır uzunluklu bir MemorySegment döndürür. Başlangıç noktasının ötesini okumak için reinterpret(byteSize) ile onu doğru boyuta yeniden yorumlamanız gerekir.

Birçok Bağımsız Değişken Geçirme

FunctionDescriptor.of(returnLayout, arg1, arg2, ...) bağımsız değişkenleri sıralı biçimde listeler. Bir void işlevi için dönüş yerleşimi olmadan FunctionDescriptor.ofVoid(args...) kullanın.

import java.lang.foreign.*;

public class Main {
    public static void main(String[] args) {
        // int (*)(const char*, int)
        FunctionDescriptor two = FunctionDescriptor.of(
            ValueLayout.JAVA_INT, ValueLayout.ADDRESS, ValueLayout.JAVA_INT);
        // void (*)(int)
        FunctionDescriptor noReturn = FunctionDescriptor.ofVoid(ValueLayout.JAVA_INT);
        System.out.println(two + " / " + noReturn);
    }
}

throws ile Hataları Ele Alma

MethodHandle.invoke bildirimi throws Throwable içerdiğinden, çağıran yönteminiz bunu ele almalı veya bildirmelidir. Örneklerin throws Throwable bildirmesinin nedeni budur.

Tutamaç Önbelleğe Alma

Bir aşağı çağrı tutamacı oluşturmak görece maliyetlidir; bu işlemi bir kez yapıp yeniden kullanın. Yaygın bir kalıp, sınıf başlatılırken tutamacı bir static final alanına bağlamak ve onu birçok kez çağırmaktır.

Tutamağın kendisi eşzamanlı çağrılar için iş parçacığı açısından güvenlidir.

Hızlı Kontrol

Bir C işaretçisi bağımsız değişkeninin nasıl açıklandığını hatırlayınız.

Özet

Yerel işlevleri çağırmayı öğrendiniz:

  • Simgeleri bulmak için Linker.nativeLinker() ile birlikte bir SymbolLookup
  • FunctionDescriptor, imzayı yerleşimlerle açıklar
  • downcallHandle, invoke edebileceğiniz bir MethodHandle üretir
  • İşaretçiler ADDRESS ile eşlenir; invoke, Throwable fırlatır

Sırada: karmaşık yerel verileri yerleşimler ve yapılarla açıklamak.

Sıkça Sorulan Sorular

“Downcall Tanıtıcıları” dersi ücretsiz mi?

Evet — “Downcall Tanıtıcıları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“Downcall Tanıtıcıları” dersinde ne öğreneceğim?

Yerel işlevleri çağırın Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Downcall Tanıtıcıları” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. JNI Yerine FFM Neden Tercih Edilir
  2. MemorySegment ve Arena
  3. Downcall Tanıtıcıları
  4. Düzenler ve Yapılar
← Java Academy Sayfasına Dön