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

Posted

技术标签:

【中文标题】如何在 Java 应用程序中嵌入 V8?【英文标题】:How to embed V8 in a Java application? 【发布时间】:2011-09-16 05:29:55 【问题描述】:

我正在寻找在我的 Java 应用程序中嵌入 Google javascript 引擎 V8 的解决方案。

你有解决办法吗?

【问题讨论】:

你知道Rhino,对吧?如果你只是想要一个用于 Java 的 JavaScript 引擎并且它必须是 V8...Rhino 将 JavaScript 编译为 Java 字节码,无论是在编译时静态还是在运行时动态(或两者,如果你两者都需要),在用 Java 编写的代码和用 JavaScript 编写的代码之间提供几乎完全的互操作性。太酷了,如果你还没有,值得一看。 @Thilo V8 据说速度很快,因为它是用 C++ 编写的。 如果没有 C/C++ 技能,您将很难嵌入 v8。 Rhino 与 Java 集成得非常好。真的太慢了​​吗?如果您正在运行大型 JS 程序,并且速度至关重要,那么使用单独的 v8 进程可能是有意义的。 @Stephan:与大多数其他基于浏览器的 JavaScript 引擎相比,V8 确实非常快,因为它可以即时将 JavaScript 编译为机器代码。 Rhino 预先或即时将 JavaScript 编译为 Java 字节码,当然,您的 JIT 会在必要时即时转换为机器码。如果 V8 最终在给定任务中更快(可能是,也可能不是),我想知道它是否足够来证明阻抗不匹配并克服边界- 将 V8 与 JVM 集成的交叉点将需要... @Stephan rhino 和 v8 之间的速度差异应该不会那么大。除了您已经在使用 Java 之外,如果您关心这些速度差异,那么请使用 C。 【参考方案1】:

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

下面是你好,世界!程序使用 J2V8。

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>

【讨论】:

我在 Android (arm + x86) 上使用 v4.2.0 (AAR),效果很好。速度快如闪电,API 非常酷且经过深思熟虑。它为我节省了很多工作。否则,我必须将大量 TypeScript 代码移植到 Java。谢谢@irbull,你就是男人! @hgoebl 感谢您抽出宝贵的时间来写这篇文章。这真的让我很开心! 截至 2019 年 1 月,@irbull 表示他打算缩小 J2V8 的范围以仅支持 Android,并且仅支持非 NodeJS JavaScript。所以如果你想要一种通用的方式将 V8 集成到 Java 中,J2V8 将不再是它。【参考方案2】:

没有任何直接的方法可以做到这一点,但是,我建议Rhino 或JNI。前者更容易,但是,不是 v8,后者是困难和挑剔,但是,v8。

或者,您可以使用单独的 v8 进程,并使用 Java 与之对话。

【讨论】:

【参考方案3】:

也许您可以尝试使用基于 Google V8 Javascript 引擎的 Java Scripting API (JSR223) 的 Jav8。我从几周前就开始研究它,它可以支持大多数简单的场景。

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

【讨论】:

链接已失效。 链接实际上并没有失效。

以上是关于如何在 Java 应用程序中嵌入 V8?的主要内容,如果未能解决你的问题,请参考以下文章

将v8变成工具

将v8变成工具

Lvgl(V8.2)自定义字体实现多国语言切换功能

Lvgl(V8.2)自定义字体实现多国语言切换功能

Lvgl(V8.2)自定义字体实现多国语言切换功能

LVGL V8.2 嵌入式Linux平台使用tslib实现输入接口(以SSD212为例)