Dans le domaine du développement multiplateforme, il peut arriver qu'une application C nécessite l'accès aux fonctionnalités fournies par les méthodes Java. Cette requête explore la faisabilité et les nuances de la réalisation de cette intégration.
Faisabilité et mécanisme
Oui, il est possible d'appeler des méthodes Java à partir du code C/C. Cependant, la procédure est quelque peu complexe et adhère à une approche réflexive et non sécurisée.
L'interface de programmation d'application (API) C fournit une méthode plus propre pour réaliser cette intégration. L'approche consiste à instancier une machine virtuelle Java (JVM) dans le code C. Dans les scénarios où le code natif est invoqué à partir de Java, la construction d'une instance de VM n'est pas nécessaire.
Implémentation
L'extrait de code fourni montre comment appeler des méthodes Java à partir d'un langage C. application :
#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; }
Compilation multiplateforme
Pour une compilation multiplateforme sur Ubuntu, exécutez la commande suivante :
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
Gestion des erreurs
Il est crucial de vérifier les codes de retour de toutes les méthodes utilisées pour une gestion appropriée des erreurs. Par exemple, l'extrait de code suivant vérifie les problèmes potentiels d'allocation de mémoire lors de la récupération de la chaîne de style C :
str = env->GetStringUTFChars(jstr, NULL); if (str == NULL) { return EXIT_FAILURE; /* out of memory */ }
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!