Invoquer des méthodes Java à partir d'applications C
Dans le domaine de l'intégration multiplateforme, la capacité d'interagir de manière transparente entre différents langages de programmation devient primordiale . L'un de ces scénarios consiste à appeler des fonctions Java à partir d'applications C.
Bien que cela ne soit pas simple, cet exploit est en effet réalisable grâce à une approche réflexive. En tirant parti de l'interface native de Java (JNI), C peut interagir avec la machine virtuelle Java (JVM). Voici une explication détaillée du processus :
Créer une machine virtuelle Java (JVM) :
Obtenez l'objet Java :
Localisez la méthode Java :
Appelez la méthode Java :
Extraire le résultat :
Nettoyage :
Exemple de code :
#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; }
Pour compiler le code sous Linux, exécutez :
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 : implémentez la gestion appropriée des erreurs en vérifiant les codes retour des méthodes JNI.
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!