java - 将 Java 嵌入到 C++ 应用程序中?

标签 java c++ java-native-interface embed

我有一个用 C++ 编写的应用程序,我可以通过用 C++ 为其编写插件来扩展应用程序功能。

我基本上想做的是将 Java 嵌入到这个应用程序中。这已经用 Python 完成了(不是我完成的)。

我读过一些有关 JNI 的内容,但总有来自使用 Java 类的完整程序的演讲。

我想做的是,在 Java 中使用 C++ 中的类与应用程序交互。
在本例中,它是一个 3D 应用程序,称为 Cinema 4D。

有没有办法在应用程序运行时(以某种脚本语言)使用 JNI 或类似的东西来编译和评估 Java 代码?

嵌入完成后的示例假想代码:

import c4d.documents.*;

class Main {
  public static void main() {
    BaseDocument doc = GetActiveDocument();
    BaseObject op = doc.GetActiveObject();
    if (op != null) {
      op.Remove();
    }
  }
}

此代码应与 Cinema 4D 交互以删除所选对象。

最佳答案

您可以在应用程序中嵌入 JVM。甲骨文的official reference book有一些更多的细节。其概要如下:

#include <jni.h>       /* where everything is defined */

int main() {
  JavaVM *jvm;       /* denotes a Java VM */
  JNIEnv *env;       /* pointer to native method interface */
  JDK1_1InitArgs vm_args; /* JDK 1.1 VM initialization arguments */
  vm_args.version = 0x00010001; /* New in 1.1.2: VM version */
  /* Get the default initialization arguments and set the class 
   * path */
  JNI_GetDefaultJavaVMInitArgs(&vm_args);
  vm_args.classpath = ...;
  /* load and initialize a Java VM, return a JNI interface 
   * pointer in env */
  JNI_CreateJavaVM(&jvm, &env, &vm_args);
  /* invoke the Main.test method using the JNI */
  jclass cls = env->FindClass("Main");
  jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
  env->CallStaticVoidMethod(cls, mid, 100);
  /* We could have created an Object and called methods on it instead */
  /* We are done. */
  jvm->DestroyJavaVM();
}

如果您愿意,您可以做更复杂的事情(例如自定义类加载器),但这只是让 JVM 在您的应用程序中工作所需的最低限度。

关于java - 将 Java 嵌入到 C++ 应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731233/

相关文章:

java - 如何通过 JNI 调用 Java 方法,让 JVM 垃圾收集参数?

Java UML API/库

c++ - 声明与(方法)不兼容 - 指针

c++ - 类方法声明中的 decltype : error when used before "referenced" member is declared

c++ - 配置:错误:无法链接到 libboost_atomic

android - 将自定义cookie设置为ffmpeg http请求

java - 从java调用JNI编写的函数而不加载DLL

java - 使用标识符拆分字符串中的单词的正则表达式模式

java - 求n叉树的最大值

java - 对集合中每个 bean 的属性调用方法