如何从C ++调用Java函数?

我如何从C ++应用程序调用Java函数?

我知道从CMD(或类似的技术)叫他们,但我宁愿不使用它们。

作为一个例子,检查从C创build一个JVM 。 它显示了创buildJVM并调用方法的示例过程。 如果JVM已经存在; 例如你的C程序被Java程序调用(callback情况),你可以cachingJNIEnv *指针。

作为一个build议,要小心从C / C ++中caching指向JVM的指针,还有一些涉及到你可以caching的语义,以后可以调用它。 为此,正如Brian Agnew指出的,检查JNI参考。

查看JNI调用接口 。 这将允许您在C(或C ++)应用程序中embeddedJVM。

请注意,存在各种更容易的机制来促进从Java调用C / C ++(例如JNA )。 这可能是值得考虑的反转你的问题,使你可以 Java调用(我明白这可能不可能为您的特定应用程序,但是)

阅读JNI 。

这个页面是有帮助的: http : //hildstrom.com/projects/jni/index.html

假设你有一个Java类:

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

一旦你有一个JVM和JNIEnv *(详情略去…),你可以从C ++调用Java方法如下:

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

这掩盖了很多细节,包括exception处理,如果省略,将会使JVM崩溃。 对于所有血腥细节search“Java本地接口”,并按照Oracle链接。

Sun有一个很好的JNI的基本例子 。

从CPP调用java方法的另一个简单方法是通过batch file。

 system() 

方法是从CPP调用exe或bat文件。 把你的类的javapath和类path放到batch file中,并使用system("batch-file-name.bat")从CPP调用该batch file。

这很简单,直接。