如何在Java应用程序中嵌入V8引擎?

34
我正在寻找在我的Java应用程序中嵌入Google JavaScript引擎V8的解决方案。您有一些解决方案吗?

9
你知道Rhino吧?如果你只是需要一个Java的JavaScript引擎,而不一定非要使用V8,那么Rhino可以将JavaScript编译为Java字节码,可以在编译时静态地或在运行时动态地进行(或者两者都可以,如果需要的话),从而提供了几乎完全的Java代码和JavaScript代码之间的互操作性。如果你还没有接触过它,那么它很酷,值得一看。 - T.J. Crowder
2
@Thilo V8 被报道称之为快速的原因是它是用 C++ 编写的。 - Stephan
4
如果你没有C/C++技能,嵌入V8会很困难。Rhino与Java的集成非常好。它真的太慢了吗?如果你运行大型JS程序,并且速度至关重要,可能将其分离为单独的V8进程是有意义的。 - Thilo
3
@Stephan:与大多数其他基于浏览器的JavaScript引擎相比,V8确实非常快,因为它会即时将JavaScript编译为机器代码。Rhino将JavaScript编译为Java字节码,可以提前编译或即时编译,当需要时,JIT会即时将其转换为机器代码。如果在执行给定任务时V8最终更快(可能是或可能不是),我想知道这是否足以证明它优于直接集成V8和JVM所需的阻抗失配和边界交叉。 - T.J. Crowder
2
@Stephan,Rhino和V8之间的速度差异不应该太大。此外,如果您关心这种速度差异,那么可以使用C语言。 - Raynos
显示剩余3条评论
3个回答

27

您可以使用 J2V8 https://github.com/eclipsesource/J2V8。它甚至可以在 Maven Central 中获取。

下面是一个使用 J2V8 的 Hello, World! 程序。

package com.example;

import com.eclipsesource.v8.V8;

public class EclipseCon_snippet5 {


    public static class Printer {
        public void print(String string) {
            System.out.println(string);
        }
    }

    public static void main(String[] args) {
        V8 v8 = V8.createV8Runtime();
        v8.registerJavaMethod(new Printer(), "print", "print", new Class<?>[]{String.class});
        v8.executeVoidScript( "print('Hello, World!');" );
        v8.release(true);
    }

}
你需要在你的pom.xml文件中指定你的平台。J2V8目前支持win32_x86,macosx_x86_64,android_x86和android_armv7l。它们不同的原因是由于本地绑定和捆绑的V8预构建版本。例如,在MacOS上,你可以使用。
<dependencies>
    <dependency>
        <groupId>com.eclipsesource.j2v8</groupId>
        <artifactId>j2v8_macosx_x86_64</artifactId>
        <version>2.0</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

2
我在Android(arm + x86)上使用v4.2.0(AAR),它运行得非常好。它的速度非常快,API设计得非常酷炫和周到。这让我省了很多工作,否则我就必须将大量的TypeScript代码移植到Java上。感谢@irbull,你真是太棒了! - hgoebl
1
@hgoebl 感谢您抽出时间写下这些内容。这真的让我开心! - irbull
4
截至2019年1月,@irbull表示他打算缩小J2V8的范围,仅支持Android和非NodeJS JavaScript。因此,如果您想要将V8集成到Java中的通用方法,J2V8将不再是最佳选择。 - Cheeso

17

也许你可以尝试使用Jav8,它是基于Google V8 Javascript引擎实现了Java Scripting API(JSR223)的。我已经在使用它几周了,它可以支持大多数简单场景。

http://code.google.com/p/jav8/


链接已失效。 - Emmanuel
链接实际上并没有失效。 - Eugene Gr. Philippov

6

对于这个问题没有一个非常直接的方法,但我建议您使用RhinoJNI。前者更容易使用, 但不支持v8,后者比较困难和棘手,但支持v8。

或者,您可以使用单独的v8进程,并使用Java与其通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接