java - jaotc库无法在javac中运行; java说没有main方法

标签 java jaotc

我正在尝试将迷你基准编译为在 WSL 上运行的 Ubuntu 18.04 的 native 代码。我将其与用 C# 编写的功能相同的代码进行比较,后者被编译为 Dotnet Native,其运行速度比 MSIL 代码快约 10 倍。我希望这是一个同类测试。我使用 OpenJDK 12 来执行此操作。下面是正在使用的命令和代码。

jaotc -J-XX:+UseParallelGC -J-XX:-UseCompressedOops --output Java/Chain.so --class-name Java.Chain:Java.Person

其次是

java -XX:AOTLibrary=Java/Chain.so Java.Chain

结果

Error: Could not find or load main class Java.Chain
Caused by: java.lang.ClassNotFoundException: Java.Chain

代码: 链.java

package Java;

public class Chain
{
    private static int ITER = 10000;
    private Person first = null;
    private static Chain[] chains = new Chain[ITER];
    private static Chain[] target = new Chain[ITER];

    public Chain(int size)
    {
        Person last = null;
        Person current = null;
        for (int i = 0 ; i < size ; i++)
        {
            current = new Person(i);
            if (first == null) first = current;
            if (last != null)
            {
                last.setNext(current);
                current.setPrev(last);
            }
            last = current;
        }
        first.setPrev(last);
        last.setNext(first);
    }

    public Person kill(int nth)
    {
        Person current = first;
        int shout = 1;
        while(current.getNext() != current)
        {
            shout = current.shout(shout, nth);
            current = current.getNext();
        }
        first = current;
        return current;
    }

    public Person getFirst()
    {
        return first;
    }
    public static void main(String[] args)
    {
        long start = System.nanoTime();

        for (int i = 0 ; i < ITER ; i++)
        {
            Chain chain = new Chain(40);
            chain.kill(3);
            chains[i] = chain;
        }

        // Ensure JIT doesn't optimize out the first loop
        for (int i = 0; i < ITER; ++i)
        {
            target[i] = chains[i];
        }

        long end = System.nanoTime();

        System.out.println(GetLastChain());

        double elapsedTime = (end - start);
        System.out.println("Elapsed time: " + elapsedTime + " nanoseconds");

        System.out.println("Time per iteration = " + elapsedTime / ITER + " nanoseconds.");
    }

    private static Chain GetLastChain()
    {
        return target[ITER - 1];
    }
}

Person.java

package Java;

    public class Person
    {
        int count;
        private Person prev = null;
        private Person next = null;

        public Person(int count)
        {
            this.count = count;
        }

        public int shout(int shout, int deadif)
        {
            if (shout < deadif) return (shout + 1);
            this.getPrev().setNext(this.getNext());
            this.getNext().setPrev(this.getPrev());
            return 1;
        }

        public int getCount()
        {
            return this.count;
        }

        public Person getPrev()
        {
            return prev;
        }

        public void setPrev(Person prev)
        {
            this.prev = prev;
        }

        public Person getNext()
        {
            return next;
        }

        public void setNext(Person next)

        {
            this.next = next;
        }
    }

我需要知道我做错了什么。我在互联网上找到的每个例子都引导我走向这一点。

最佳答案

我没有使用 jaotc 的经验,但谷歌搜索告诉我你首先必须将 Chain.java 编译为 Chain.class,然后将 Chain.class 编译为 Chain.so

javac Java/Chain.java Java/Person.java

完整的脚本是

javac Java/Chain.java Java/Person.java
jaotc -J-XX:+UseParallelGC -J-XX:-UseCompressedOops  --output Java/Chain.so --class-name Java.Chain:Java.Person
java -XX:AOTLibrary=Java/Chain.so Java.Chain

关于java - jaotc库无法在javac中运行; java说没有main方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55813626/

相关文章:

java - 是否可以换掉 Gradle 用来运行 Java 的 JavaExecAction?

java - Spring - 如何配置 RestTemplate 以使用 toString() 方法作为对象序列化器?

java - Volley NoConnectionError : java.net.UnknownHostException

使用 JDBC 将记录插入数据库时​​出现 java.sql.SQLException : ORA-00928: missing SELECT keyword.

java - 我想给jdk 1.6添加一个外部库

java - 您可以将 jaotc(Java 提前编译器)与 jlink(用于创建运行时镜像的模块汇编器/优化器)一起使用吗?

java - jaotc编译后还需要原来的class文件吗?

java - 如何运行用 jaotc 编译的类?