Language উন্নত

FFM জাভাকে JNI বয়লারপ্লেট বা C-সাইডে Java জ্ঞান ছাড়াই সরাসরি C লাইব্রেরি কল করতে দেয়।

✕ 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;
// }
এই কোডে সমস্যা দেখছেন? আমাদের জানান।
👁

C কোড সাদামাটা C-ই থাকে

C ফাংশনে কোনো JNI অ্যানোটেশন বা JNIEnv বয়লারপ্লেট প্রয়োজন নেই — যেকোনো বিদ্যমান C লাইব্রেরি যেমন আছে তেমনি কল করা যায়।

আরও নমনীয়

অ্যাডাপ্টার কোড লেখা বা হেডার ফাইল তৈরি না করেই বেশিরভাগ বিদ্যমান C/C++ লাইব্রেরি সরাসরি কল করুন।

🛠️

সহজতর ওয়ার্কফ্লো

থামার, javac -h চালানোর এবং জেনারেটেড .h ফাইলে সংজ্ঞায়িত ইন্টারফেস ইমপ্লিমেন্ট করার প্রয়োজন নেই।

পুরনো পদ্ধতি
JNI (Java Native Interface)
আধুনিক পদ্ধতি
FFM (Foreign Function & Memory API)
JDK থেকে
22
কঠিনতা
উন্নত
Java থেকে C কোড কল করা
উপলব্ধ

JDK 22-এ মানসম্পন্ন (মার্চ 2024); পূর্বে JDK 14 থেকে ইনকিউবেটিং

Java-তে নেটিভ C/C++ কোড কল করার দুটি পদ্ধতি রয়েছে: ঐতিহ্যগত JNI এবং আধুনিক FFM API। JNI-এর সাথে, আপনি একটি মেথড native হিসেবে ঘোষণা করেন, C হেডার ফাইল তৈরি করতে javac -h চালান, তারপর কষ্টকর JNI C API (JNIEnv, jstring ইত্যাদি) ব্যবহার করে ফাংশন ইমপ্লিমেন্ট করেন। Java 22-এ স্ট্যান্ডার্ড API হিসেবে প্রবর্তিত FFM এই সব বাদ দেয়: C কোড শুধু সাধারণ C — কোনো JNI কনভেনশন প্রয়োজন নেই। এটি পরিবর্তন ছাড়াই বিদ্যমান C/C++ লাইব্রেরি কল করা অনেক সহজ করে তোলে। Java সাইড নিরাপদ অফ-হিপ মেমরি ম্যানেজমেন্টের জন্য Arena এবং ডাউনকলের জন্য MethodHandle ব্যবহার করে, যা নমনীয়তা এবং নিরাপত্তা উভয়ই নিশ্চিত করে।