Language İleri

Java'dan C Kodu Çağırma

FFM, Java'nın JNI şablon kodu veya C tarafında Java bilgisi gerektirmeksizin C kütüphanelerini doğrudan çağırmasını sağlar.

✕ Java 1.1+
public class CallCFromJava {
    static { System.loadLibrary("strlen-jni"); }
    public static native long strlen(String s);
    public static void main(String[] args) {
        long ret = strlen("Bambi");
        System.out.println("Return value " + ret); // 5
    }
}

// Run javac -h to generate the .h file, then write C:
// #include "CallCFromJava.h"
// #include <string.h>
// JNIEXPORT jlong JNICALL Java_CallCFromJava_strlen(
//     JNIEnv *env, jclass clazz, jstring str) {
//     const char* s = (*env)->GetStringUTFChars(env, str, NULL);
//     jlong len = (jlong) strlen(s);
//     (*env)->ReleaseStringUTFChars(env, str, s);
//     return len;
// }
✓ Java 22+
void main() throws Throwable {
    try (var arena = Arena.ofConfined()) {
        // Use any system library directly — no C wrapper needed
        var stdlib = Linker.nativeLinker().defaultLookup();
        var foreignFuncAddr = stdlib.find("strlen").orElseThrow();
        var strlenSig = FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS);
        var strlenMethod = Linker.nativeLinker() .downcallHandle(foreignFuncAddr, strlenSig);
        var ret = (long) strlenMethod.invokeExact(arena.allocateFrom("Bambi"));
        System.out.println("Return value " + ret); // 5
    }
}

// Your own C library needs no special Java annotations:
// long greet(char* name) {
//     printf("Hello %s\n", name);
//     return 0;
// }
Bu kodda bir sorun mu gördünüz? Bize bildirin.
👁

C kodu sade C olarak kalır

C işlevi JNI açıklamaları veya JNIEnv şablon kodu gerektirmez — mevcut herhangi bir C kütüphanesi olduğu gibi çağrılabilir.

Daha esnek

Bağdaştırıcı kod yazmadan veya başlık dosyaları oluşturmadan mevcut C/C++ kütüphanelerinin çoğunu doğrudan çağırın.

🛠️

Daha kolay iş akışı

Durmanıza, javac -h çalıştırmanıza ve oluşturulan .h dosyasında tanımlanan arayüzü uygulamanıza gerek yoktur.

Eski Yaklaşım
JNI (Java Native Interface)
Modern Yaklaşım
FFM (Foreign Function & Memory API)
JDK'dan itibaren
22
Zorluk
İleri
Java'dan C Kodu Çağırma
Mevcut

JDK 22'de standartlaştırıldı (Mart 2024); daha önce JDK 14'ten bu yana inkübasyon aşamasındaydı

Java'nın yerel C/C++ kodu çağırmak için iki yaklaşımı vardır: geleneksel JNI ve modern FFM API'si. JNI ile bir metodu native olarak tanımlar, C başlık dosyası oluşturmak için javac -h çalıştırır, ardından zahmetli JNI C API'sini (JNIEnv, jstring vb.) kullanarak işlevi uygularsınız. Java 22'de standart API olarak tanıtılan FFM, bunların tümünü ortadan kaldırır: C kodu yalnızca sade C'dir — JNI kurallarına gerek yoktur. Bu, mevcut C/C++ kütüphanelerini değişiklik yapmadan çağırmayı çok daha kolay hale getirir. Java tarafı, güvenli yığın dışı bellek yönetimi için Arena ve downcall için MethodHandle kullanarak hem esneklik hem de güvenlik sağlar.