Java uygulamalarında C fonksiyonlarını çağırmak, performans veya mevcut C tabanlı kütüphaneleri kullanma ihtiyacı nedeniyle sıkça karşılaşılan bir durumdur. Uzun yıllar boyunca bu işlem için standart yöntem Java Native Interface (JNI) idi. Ancak JNI'nin karmaşıklığı ve kullanım zorluğu, geliştiricilerin bu yöntemi tercih etmesini engelliyordu. Java'nın saf kullanımını teşvik etmek amacıyla bilinçli olarak zorlaştırıldığı bile düşünülüyordu.
Java 22 ile birlikte, java.lang.foreign paketi altında "Foreign Function & Memory API" adlı yeni bir yaklaşım sunuldu. Bu API, C fonksiyonlarını Java'dan daha kolay ve verimli bir şekilde çağırmayı hedefliyor. Geliştiricilerin öncelikle bir Linker ve bir SymbolLookup örneği edinmesi gerekiyor. SymbolLookup aracılığıyla çağrılacak yerel fonksiyonun bellek segmenti bulunur ve ardından Linker kullanılarak bu segmente karşılık gelen bir MethodHandle oluşturulur. MethodHandle, fonksiyonun dönüş tipi ve parametrelerini tanımlayan bir FunctionDescriptor ile birlikte yapılandırılır. Bu MethodHandle, standart bir Java fonksiyonu gibi invokeExact metoduyla çağrılabilir, ancak dönüş değerinin Object olması nedeniyle tip dönüşümü gerekebilir.
API, C veri yapılarını Java'dan tahsis etme imkanı da sunar. Arena adı verilen yapılar kullanılarak MemoryLayout ile C'deki struct benzeri yapılar tanımlanabilir ve arena.allocate ile bellek segmentleri oluşturulabilir. Bu segmentler daha sonra yerel C koduna işaretçi olarak geçirilebilir. Süreci daha da kolaylaştırmak için jextract adlı bir araç, yerel kütüphane başlık dosyalarından otomatik Java bağlamaları (bindings) üreterek geliştiricilerin iş yükünü önemli ölçüde azaltır. Bu yeni API, Java ve C arasındaki etkileşimi basitleştirerek geliştiricilere daha güçlü ve esnek çözümler sunuyor.
Java'nın yeni Foreign Function & Memory API'si, C fonksiyonlarını Java'dan çağırma sürecini önemli ölçüde basitleştirerek geliştiricilere daha verimli ve esnek bir entegrasyon imkanı sunuyor.