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

2022-09-01 16:52:42

我用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 交互以删除所选对象。


答案 1

您可以在应用程序中嵌入 JVM。甲骨文的官方参考书有更多细节。它的概要是:

#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在你的应用程序中工作所需的最低限度。


答案 2

对于是要将Java嵌入到C++应用程序中还是相反,似乎存在一些混淆。我将接手每一个案例。

  1. 要将java嵌入到c ++应用程序中,您可以对java程序进行套接字调用。在 java 端,使用 SocketServer,在第 C++ 端,使用 General Socket Layer 库。这是迄今为止最简单、最具可扩展性的方法。随着 Java 工作负载的不断增加,您不断添加额外的 jvm。部署起来有点复杂,但它工作得很好。

  2. 用于在java中嵌入C++应用程序。这很简单。C++应用程序编译到共享库中,并使用 JNI 调用它。


推荐