如何从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。
这很简单,直接。