如何从C ++应用程序调用Java函数?
我知道从CMD(或类似技术)调用它们,但我宁愿不使用它们。
答案 0 :(得分:21)
例如,选中Creating a JVM from C。它显示了创建JVM并调用方法的示例过程。如果JVM已经存在;例如你的C程序是由Java程序调用的(回调情况),你可以缓存JNIEnv *指针。
作为建议,请注意从C / C ++缓存指向JVM的指针,关于可以缓存的内容涉及一些语义,以后可以调用它。为此,正如Brian Agnew指出的那样,检查JNI参考。
答案 1 :(得分:17)
查看JNI Invocation interface。这将允许您在C(或C ++)应用程序中嵌入JVM。
请注意,存在各种更简单的机制来促进从Java调用C / C ++(例如JNA)。可能值得考虑反转您的问题,以便您可以从 Java调用(我知道这可能不适用于您的特定应用程序)
答案 2 :(得分:3)
此页面很有帮助: 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);
这掩盖了 lot 的详细信息,包括异常处理,如果省略将导致JVM崩溃。对于所有血腥细节搜索“Java Native Interface”并遵循Oracle链接。
答案 3 :(得分:2)
阅读JNI。
答案 4 :(得分:1)
答案 5 :(得分:-3)
从CPP调用java方法的另一种简单方法是通过批处理文件。
system()
是从CPP调用exe或bat文件的方法。将您的类与批处理文件中的java路径和类路径放在一起,并使用system("batch-file-name.bat")
从CPP调用该批处理文件。
简单直接。