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

use*_*898 46 c++ java

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

我知道从CMD(或类似技术)调用它们,但我宁愿不使用它们.

Dan*_* H. 21

例如,选中" 从C创建JVM".它显示了创建JVM并调用方法的示例过程.如果JVM已经存在; 例如,你的C程序是由Java程序调用的(回调情况),你可以缓存JNIEnv*指针.

作为一个建议,小心缓存从C/C++到JVM的指针,有一些语法涉及到你可以缓存的内容,以后可以调用它.为此,正如Brian Agnew指出的那样,检查JNI参考.


Bri*_*new 18

查看JNI调用界面.这将允许您在C(或C++)应用程序中嵌入JVM.

注意,存在各种更容易的机制以便于从Java调用C/C++(例如JNA).可能值得考虑反转您的问题,以便您可以 Java 调用(我知道这可能不适用于您的特定应用程序)


Whe*_*zil 5

此页面很有帮助:http : //hildstrom.com/projects/jni/index.html

假设您有一个 Java 类:

package foo;
public class bar {
    public static int timesTen(int input){
        return input * 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

一旦你有一个 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);
Run Code Online (Sandbox Code Playgroud)

这掩盖了很多细节,包括异常处理,如果省略这些细节会导致 JVM 崩溃。有关所有血腥详细信息,请搜索“Java Native Interface”并点击 Oracle 链接。

既然有人问......这就是你如何获得Env*。请注意,如果 JVM 调用您的本机代码,则它已经有一个 Env*。

JNIEnv* env(0);
jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (rv == JNI_OK) {
    return env;
} else if (rv == JNI_EDETACHED) {
    // This happens if you created the thread, not the JVM
    rv = vm->AttachCurrentThread((void**)&env, 0);
    if (rv != JNI_OK) {
        // error
    }
} else {
    // error
}
Run Code Online (Sandbox Code Playgroud)

使用 JNI 从 C/C++ 调用 Java 非常繁琐且容易出错,这一点我再怎么强调也不为过。错误是隐秘的和低级的。您必须处理异常,并且必须分离线程,否则事情会变得丑陋。

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 (4认同)