Java使用GraalVM的本机映像调用C库

Java使用GraalVM的本机映像调用C库,java,graalvm,graalvm-native-image,Java,Graalvm,Graalvm Native Image,我有一个简单的项目: 它所做的就是从C库调用getpid。该项目非常简单: public static void main(String[] args) throws Exception { System.out.println("start"); C_lib cLib = Native.loadLibrary("c", C_lib.class); int getpid = cLib.getpid(); System.out

我有一个简单的项目: 它所做的就是从C库调用getpid。该项目非常简单:

public static void main(String[] args) throws Exception {
    System.out.println("start");
    C_lib cLib = Native.loadLibrary("c", C_lib.class);
    int getpid = cLib.getpid();
    System.out.println("pid = " + getpid);
    System.out.println("end");
  }
从IDE启动时,一切正常:

start
pid = 155080
end
尝试使用GraalVM的本机映像进行构建时,我遇到以下错误:

[simpletest:155323]      compile:   2,597.81 ms,  2.05 GB
Fatal error:org.graalvm.compiler.graph.GraalGraphError: java.lang.NullPointerException
        at node: 43|&
        at method: Object com.oracle.svm.reflect.JNIGeneratedMethodSupport_getFieldOffsetFromId_5041c78d77a7b3d62103393b72fc35d80d2cc709.invoke(Object, Object[])
        at org.graalvm.compiler.phases.common.CanonicalizerPhase$Instance.tryCanonicalize(CanonicalizerPhase.java:397)
        at org.graalvm.compiler.phases.common.CanonicalizerPhase$Instance.processNode(CanonicalizerPhase.java:325)
        at org.graalvm.compiler.phases.common.CanonicalizerPhase$Instance.processWorkSet(CanonicalizerPhase.java:302)
        at org.graalvm.compiler.phases.common.CanonicalizerPhase$Instance.run(CanonicalizerPhase.java:264)
        at org.graalvm.compiler.phases.common.CanonicalizerPhase.run(CanonicalizerPhase.java:177)
        at org.graalvm.compiler.phases.common.CanonicalizerPhase.run(CanonicalizerPhase.java:73)
        at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:214)
        at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:147)
        at com.oracle.svm.hosted.code.CompileQueue.doInlineTrivial(CompileQueue.java:587)
        at com.oracle.svm.hosted.code.CompileQueue.access$000(CompileQueue.java:156)
        at com.oracle.svm.hosted.code.CompileQueue$TrivialInlineTask.run(CompileQueue.java:284)
        at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:173)
        at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.NullPointerException
        at org.graalvm.compiler.nodes.calc.BinaryArithmeticNode.tryConstantFold(BinaryArithmeticNode.java:120)
我尝试过很多次,很多不同的解决方案。。。但现在我没有更多的检查。
我请求帮助修理这项工程。我认为这是可能的,因为对于某些配置,我的错误与https://github.com/oracle/graal/issues/2261中的错误相同。。。有人把它修好了。。。但是没有编写解决方案:(

我认为目前JNA在本机映像中不起作用。如果可能的话,您可以使用JNI。或者您可以使用另一个本机代码接口,专门在本机映像中工作。可以在
org.graalvm.nativeimage.c
的javadoc及其子包中找到一些信息: 下面是一个使用它的示例: