Dalam bidang pembangunan merentas platform, mungkin timbul bahawa aplikasi C memerlukan akses kepada fungsi yang disediakan oleh kaedah Java. Pertanyaan ini meneroka kemungkinan dan nuansa mencapai penyepaduan ini.
Kebolehlaksanaan dan Mekanisme
Ya, adalah mungkin untuk memanggil kaedah Java dari dalam kod C/C. Walau bagaimanapun, prosedurnya agak rumit dan mematuhi pendekatan reflektif dan bukan jenis selamat.
Antara Muka Pengaturcaraan Aplikasi (API) C menyediakan kaedah yang lebih bersih untuk mencapai penyepaduan ini. Pendekatan ini melibatkan penggunaan Mesin Maya Java (JVM) dalam kod C. Dalam senario di mana kod asli digunakan daripada Java, membina tika VM adalah tidak diperlukan.
Pelaksanaan
Coretan kod yang disediakan menunjukkan cara memanggil kaedah Java daripada C aplikasi:
#include <jni.h> #include <stdio.h> int main() { JavaVM *vm; // Pointer to JVM JNIEnv *env; // JNI interface to interact with JVM JavaVMInitArgs vm_args; // JVM initialization arguments // Initialize JVM arguments vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 0; vm_args.ignoreUnrecognized = 1; // Construct a Java Virtual Machine jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // Create a Java string object jstring jstr = env->NewStringUTF("Hello World"); // Get the "java/lang/String" class jclass clazz = env->FindClass("java/lang/String"); // Get the "toLowerCase()" method ID jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;"); // Invoke the "toLowerCase()" method on the string object jobject result = env->CallObjectMethod(jstr, to_lower); // Convert the Java string to a C-style string const char* str = env->GetStringUTFChars((jstring) result, NULL); // Print the converted string printf("%s\n", str); // Release the C-style string env->ReleaseStringUTFChars(jstr, str); // Destroy the Java Virtual Machine vm->DestroyJavaVM(); return EXIT_SUCCESS; }
Merentas Platform Kompilasi
Untuk kompilasi merentas platform pada Ubuntu, laksanakan arahan berikut:
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
Pengendalian Ralat
Adalah penting untuk sahkan kod pemulangan semua kaedah yang digunakan untuk pengendalian ralat yang betul. Sebagai contoh, coretan kod berikut menyemak kemungkinan isu peruntukan memori apabila mendapatkan rentetan gaya C:
str = env->GetStringUTFChars(jstr, NULL); if (str == NULL) { return EXIT_FAILURE; /* out of memory */ }
Atas ialah kandungan terperinci Bagaimana untuk Memanggil Kaedah Java dari Aplikasi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!