Comment appeler des méthodes Java à partir d'applications C
Problème :
Il est possible de invoquer des fonctions définies dans le code Java à partir d'une application C ?
Réponse :
Oui, il est possible d'appeler des méthodes Java à partir du code C, mais le processus est quelque peu complexe . Cette approche utilise la réflexion et fonctionne de manière non sécurisée.
Implémentation :
Le code C crée une instance de la machine virtuelle Java (JVM) à partir de dans le code C. Si le code natif est invoqué depuis Java, la création d'une instance de VM n'est pas nécessaire.
Voici un exemple de comment accéder à une méthode Java depuis C :
#include<jni.h> #include<stdio.h> int main(int argc, char** argv) { JavaVM *vm; JNIEnv *env; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_2; vm_args.nOptions = 0; vm_args.ignoreUnrecognized = 1; // Create a JVM jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args); // Create a Java String object jstring jstr = env->NewStringUTF("Hello World"); // Get the class containing the method to be invoked jclass clazz = env->FindClass("java/lang/String"); // Get the method to be called jmethodID to_lower = env->GetMethodID(clazz, "toLowerCase", "()Ljava/lang/String;"); // Invoke the method on the object jobject result = env->CallObjectMethod(jstr, to_lower); // Convert the result to a C-style string const char* str = env->GetStringUTFChars((jstring) result, NULL); printf("%s\n", str); // Clean up env->ReleaseStringUTFChars(jstr, str); // Destroy the JVM vm->DestroyJavaVM(); return 0; }
Compilation :
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
Remarque : Il est crucial de gérer les codes d'erreur des méthodes JNI pour mettre en œuvre une gestion appropriée des erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!