Bagaimanakah kaedah Java boleh digunakan daripada aplikasi C?

Susan Sarandon
Lepaskan: 2024-11-09 17:35:02
asal
792 orang telah melayarinya

How can Java methods be invoked from C   applications?

Memanfaatkan Kaedah Java daripada Aplikasi C

Dalam bidang integrasi merentas platform, keupayaan untuk berinteraksi dengan lancar antara bahasa pengaturcaraan yang berbeza menjadi yang terpenting . Satu senario sedemikian melibatkan panggilan fungsi Java dari dalam aplikasi C.

Walaupun tidak mudah, pencapaian ini sememangnya boleh dicapai melalui pendekatan reflektif. Dengan memanfaatkan Antara Muka Asli Java (JNI), C boleh berinteraksi dengan Mesin Maya Java (JVM). Berikut ialah penjelasan terperinci tentang proses tersebut:

  1. Buat Mesin Maya Java (JVM):

    • Mulakan JNI dengan mencipta Objek JavaVM dan persekitaran JNIEnv* yang sepadan.
    • Tentukan versi dan pilihan JNI yang diingini melalui JavaVMInitArgs.
  2. Dapatkan Objek Java:

    • Tukar objek Java yang diperlukan kepada C jstring menggunakan NewStringUTF.
  3. Cari Kaedah Java:

    • Cari kelas yang mengandungi kaedah yang disasarkan menggunakan FindClass.
    • Kenal pasti kaedah dengan nama dan tandatangan menggunakan GetMethodID.
  4. Panggil Kaedah Java:

    • Panggil kaedah Java pada objek dengan CallObjectMethod.
    • Dapatkan semula hasil sebagai jobject dan hantar ke jenis yang sesuai.
  5. Ekstrak Hasil:

    • Tukar hasil jstring kepada rentetan gaya C menggunakan GetStringUTFChars.
  6. Bersihkan:

    • Lepaskan sumber JNI dengan ReleaseStringUTFChars.
    • Hancurkan JVM dengan DestroyJavaVM.

Contoh Kod:

#include <jni.h>
#include <stdio.h>

int main() {
    JavaVM *vm;
    JNIEnv *env;
    JavaVMInitArgs vm_args;
    vm_args.version = JNI_VERSION_1_2;
    vm_args.nOptions = 0;
    vm_args.ignoreUnrecognized = 1;

    // Construct a VM
    jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

    // Construct a String
    jstring jstr = env->NewStringUTF("Hello World");

    // Find the class and method
    jclass clazz = env->FindClass("java/lang/String");
    jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;");

    // Call the method
    jobject result = env->CallObjectMethod(jstr, to_lower);

    // Get the C-style string
    const char *str = env->GetStringUTFChars((jstring)result, NULL);

    printf("%s\n", str);

    // Clean up
    env->ReleaseStringUTFChars(jstr, str);
    vm->DestroyJavaVM();
    return 0;
}
Salin selepas log masuk

Untuk menyusun kod pada Linux, jalankan:

g++ -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux -L/usr/lib/jvm/java-6-sun/jre/lib/i386/server/ -ljvm jnitest.cc
Salin selepas log masuk

Nota: Laksanakan pengendalian ralat yang betul dengan menyemak kod pemulangan kaedah JNI.

Atas ialah kandungan terperinci Bagaimanakah kaedah Java boleh digunakan daripada aplikasi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan