【问题标题】:GraalVM: Access to native code is not allowed by the host environmentGraalVM:宿主环境不允许访问本机代码
【发布时间】:2018-04-25 17:01:01
【问题描述】:

我最近刚刚设置了一个 Centos7 虚拟机来玩 GraalVM。我下载了 graalvm-1.0.0-rc1,安装了 Netbeans8.2,并下载了 FastR 扩展(通过 gu)。然后我编写了一个简单的 java 程序来测试一些支持的各种语言。下面是我写的代码:

package javatest;

import org.graalvm.polyglot.*;
import java.io.PrintStream;
import java.util.Set;

public class JavaTest {

public static void main(String[] args) {

    PrintStream output = System.out;
    Context context = Context.create();
    Set<String> languages = context.getEngine().getLanguages().keySet();
    output.println("Current Languages available in GraalVM: " + languages);

    // TODO code application logic here
    System.out.println("Java: Hello World");

    context.eval("js","print('JavaScript: Hello World')");
    context.eval("R", "print('R: Hello World');");
  }
}

输出如下:

run:
Current Languages available in GraalVM: [R, js, llvm]
Java: Hello World
JavaScript: Hello World
FastR unexpected failure: error loading libR from: /usr/local/graalvm-1.0.0- 
    rc1/jre/languages/R/lib/libR.so.
If running on NFI backend, did you provide location of libtrufflenfi.so as 
value of system property 'truffle.nfi.library'?
The current value is '/usr/local/graalvm-1.0.0- 
    rc1/jre/lib/amd64/libtrufflenfi.so'. 
Details: Access to native code is not allowed by the host environment.
Exception in thread "main" org.graalvm.polyglot.PolyglotException
   at org.graalvm.polyglot.Context.eval(Context.java:336)
   at javatest.JavaTest.main(JavaTest.java:32)

正如您在最初调用查看支持的语言时看到的那样,它识别出 R 已安装,但是一旦我在该语言上调用 eval,它就会退出。 trufflenfi.so 文件在那里并且可用。我已将其定义为运行参数(即使我不需要)。

我找不到任何关于为什么“主机环境不允许访问本机代码”的显示并且不知所措。关于我做错了什么的任何想法?注意:我也用 python 和 ruby​​ 进行了相同的测试,得到了相同的结果,但在最简单的测试用例中被删除了。

【问题讨论】:

  • 能否提供用于构建和运行的命令行?唯一想到的...

标签: graalvm


【解决方案1】:

这是使用 GraalVM 多语言 API 创建的多语言上下文的安全功能。默认情况下,每种语言都与宿主环境隔离,因此不允许访问 Java 类、本地访问或文件系统中的文件。目前在 GraalVM 1.0.0-RC1 中,Ruby 和 R 语言需要本地访问才能启动它们的环境。 JavaScript 和 Python 语言不需要本机访问即可启动。

如果您想创建具有所有访问权限的上下文,您可以像这样创建上下文:

Context.newBuilder().allowAllAccess(true).build();

您也可以选择性地允许访问本机代码:

Context.newBuilder().allowNativeAccess(true).build();

这是你的例子:

package javatest;

import org.graalvm.polyglot.*;
import java.io.PrintStream;
import java.util.Set;

public class JavaTest {

public static void main(String[] args) {

    PrintStream output = System.out;
    Context context = Context.newBuilder().allowAllAccess(true).build();
    Set<String> languages = context.getEngine().getLanguages().keySet();
    output.println("Current Languages available in GraalVM: " + languages);

    // TODO code application logic here
    System.out.println("Java: Hello World");

    context.eval("js","print('JavaScript: Hello World')");
    context.eval("R", "print('R: Hello World');");
  }
}

以下是更多使用 Ruby 和 R 的所有访问权限的示例: http://www.graalvm.org/docs/graalvm-as-a-platform/embed/

【讨论】:

  • 非常感谢!像魅力一样工作。在我对错误的有限研究期间,我对此一无所知,所以我想这会对很多人有所帮助。万事如意..
猜你喜欢
  • 1970-01-01
  • 2022-01-26
  • 2010-12-29
  • 2017-09-15
  • 1970-01-01
  • 2010-11-19
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多