web-dev-qa-db-fra.com

Comment appeler Java fonctions de C ++?

Comment puis-je appeler Java fonctions à partir d'une application C++?

Je sais comment les appeler depuis CMD (ou des techniques similaires), mais je préfère ne pas les utiliser.

46
user63898

Par exemple, cochez Création d'une machine virtuelle Java à partir de C . Il montre un exemple de procédure pour créer une machine virtuelle Java et appeler une méthode. Si la JVM existe déjà; par exemple. votre programme C est invoqué par le programme Java (situation de rappel), vous pouvez mettre en cache le pointeur JNIEnv *.

À titre de conseil, faites attention aux pointeurs de mise en cache vers la machine virtuelle Java à partir de C/C++, il y a une sémantique impliquée quant à ce que vous pouvez mettre en cache et cela pourrait être invoqué plus tard. Pour cela, comme l'a souligné Brian Agnew, vérifiez la référence JNI.

21
Daniel H.

Découvrez interface d'invocation JNI . Cela vous permettra d'incorporer une machine virtuelle Java dans votre application C (ou C++).

Notez que divers mécanismes plus faciles existent pour faciliter l'appel C/C++ à partir de Java (par exemple JNA ). Cela peut valoir la peine d'être considéré inverser votre problème de telle sorte que vous puissiez appeler à partir de Java (je comprends que cela pourrait ne pas être possible pour votre application particulière) , pourtant)

17
Brian Agnew

Cette page est utile: http://hildstrom.com/projects/jni/index.html

Supposons que vous ayez une classe Java:

package foo;
public class bar {
    public static int timesTen(int input){
        return input * 10;
    }
}

Une fois que vous avez une JVM et JNIEnv * (détails omis ...), vous pouvez appeler la méthode Java à partir de C++ comme suit:

jclass myClass = env->FindClass("foo.bar");
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I");
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10);

Cela passe sur un lot de détails, y compris la gestion des exceptions, qui, s'il est omis, plantera votre machine virtuelle Java. Pour tous les détails sanglants, recherchez "Java Native Interface" et suivez les liens Oracle.

3
Wheezil

Lisez sur JNI .

2
dirkgently
1
Yuval Adam