Im Bereich der plattformübergreifenden Entwicklung kann es vorkommen, dass eine C-Anwendung Zugriff auf Funktionalitäten benötigt, die von Java-Methoden bereitgestellt werden. Diese Abfrage untersucht die Machbarkeit und die Nuancen zum Erreichen dieser Integration.
Machbarkeit und Mechanismus
Ja, es ist möglich, Java-Methoden aus C/C-Code heraus aufzurufen. Das Verfahren ist jedoch etwas kompliziert und folgt einem reflektierenden und nicht typsicheren Ansatz.
Die C Application Programming Interface (API) bietet eine sauberere Methode zum Erreichen dieser Integration. Der Ansatz beinhaltet die Instanziierung einer Java Virtual Machine (JVM) innerhalb des C-Codes. In Szenarien, in denen der native Code aus Java aufgerufen wird, ist die Erstellung einer VM-Instanz nicht erforderlich.
Implementierung
Das bereitgestellte Codefragment zeigt, wie Java-Methoden aus einem C aufgerufen werden Anwendung:
#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; }
Plattformübergreifend Kompilierung
Für die plattformübergreifende Kompilierung unter Ubuntu führen Sie den folgenden Befehl aus:
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
Fehlerbehandlung
Es ist von entscheidender Bedeutung Überprüfen Sie die Rückkehrcodes aller verwendeten Methoden für eine ordnungsgemäße Fehlerbehandlung. Beispielsweise prüft das folgende Codefragment beim Abrufen der Zeichenfolge im C-Stil auf mögliche Probleme bei der Speicherzuordnung:
str = env->GetStringUTFChars(jstr, NULL); if (str == NULL) { return EXIT_FAILURE; /* out of memory */ }
Das obige ist der detaillierte Inhalt vonWie rufe ich Java-Methoden aus C-Anwendungen auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!