在 C++ 中使用 Java 作为“脚本”语言
Use Java as “scripting” language in C++
假设我正在用 C++ 设计一个跨平台应用程序,它可以通过附加组件进行用户扩展。然后应用程序提供 C++ API 并将加载动态对象(.so
、.dll
等)。但是,这对于必须针对 6 个目标平台(Windows x86
/x86-64
、MacOS X x86
/x86-64
和 GNU/Linuxx86
/x86-64
).
为了保持便携性,我想到了用libruby
提供一个RubyAPI。通过一些工作,我得到了一个概念证明。问题是我担心表演。这些附加组件可能会变大并且 CRuby 没那么快。
然后我想,为什么不Java?
- Java 字节码具有更好的运行时性能,尤其是使用 JIT;
- 便携;
- 分发很简单,用户只需要提供一个
jar
;
- 用户可以提供闭源附加组件(即使反编译Java字节码并不难);
- 了解 Java 的人多于 Ruby。
现在的问题是,如何实现呢?我做了一些研究,只发现了 JNI(Java 本机接口 )。不过,这似乎能够从 Java 而不是相反的方式“调用”C++。
您可以使用 JNI Invocation API,它允许您从 C 或 C++ 启动 VM。
启动 VM 后,JNI specification 会列出许多其他用于与 Java 交互的 C 函数。
I made some research and only found out about JNI (Java native interface). This seems, though, to be able to “call” C++ from Java and not the other way around.
您可能正在查看本机函数,它允许您在 C 中定义 Java 方法。
假设我正在用 C++ 设计一个跨平台应用程序,它可以通过附加组件进行用户扩展。然后应用程序提供 C++ API 并将加载动态对象(.so
、.dll
等)。但是,这对于必须针对 6 个目标平台(Windows x86
/x86-64
、MacOS X x86
/x86-64
和 GNU/Linuxx86
/x86-64
).
为了保持便携性,我想到了用libruby
提供一个RubyAPI。通过一些工作,我得到了一个概念证明。问题是我担心表演。这些附加组件可能会变大并且 CRuby 没那么快。
然后我想,为什么不Java?
- Java 字节码具有更好的运行时性能,尤其是使用 JIT;
- 便携;
- 分发很简单,用户只需要提供一个
jar
; - 用户可以提供闭源附加组件(即使反编译Java字节码并不难);
- 了解 Java 的人多于 Ruby。
现在的问题是,如何实现呢?我做了一些研究,只发现了 JNI(Java 本机接口 )。不过,这似乎能够从 Java 而不是相反的方式“调用”C++。
您可以使用 JNI Invocation API,它允许您从 C 或 C++ 启动 VM。
启动 VM 后,JNI specification 会列出许多其他用于与 Java 交互的 C 函数。
I made some research and only found out about JNI (Java native interface). This seems, though, to be able to “call” C++ from Java and not the other way around.
您可能正在查看本机函数,它允许您在 C 中定义 Java 方法。