Maison > développement back-end > C++ > Comment les méthodes Java peuvent-elles être invoquées à partir d'applications C ?

Comment les méthodes Java peuvent-elles être invoquées à partir d'applications C ?

Susan Sarandon
Libérer: 2024-11-09 17:35:02
original
823 Les gens l'ont consulté

How can Java methods be invoked from C   applications?

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 :

  1. Créer une machine virtuelle Java (JVM) :

    • Initialisez la JNI en créant un Objet JavaVM et environnement JNIEnv* correspondant.
    • Spécifiez la version et les options JNI souhaitées via JavaVMInitArgs.
  2. Obtenez l'objet Java :

    • Convertissez l'objet Java requis en une jstring C à l'aide de NewStringUTF.
  3. Localisez la méthode Java :

    • Trouvez la classe qui contient la méthode ciblée à l'aide de FindClass.
    • Identifiez la méthode par son nom et sa signature à l'aide de GetMethodID.
  4. Appelez la méthode Java :

    • Invoquez la méthode Java sur l'objet avec CallObjectMethod.
    • Récupérez le résultat en tant que jobject et convertissez-le dans le type approprié.
  5. Extraire le résultat :

    • Convertissez le résultat jstring en une chaîne de style C à l'aide de GetStringUTFChars.
  6. Nettoyage :

    • Libérez les ressources JNI avec ReleaseStringUTFChars.
    • Détruisez la JVM avec DestroyJavaVM.

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;
}
Copier après la connexion

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal