Maison > développement back-end > C++ > le corps du texte

Comment appeler des méthodes Java à partir d'applications C ?

Mary-Kate Olsen
Libérer: 2024-11-17 09:46:04
original
673 Les gens l'ont consulté

How to Call Java Methods from C   Applications?

Invocation de méthodes Java à partir d'applications C

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

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

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

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