使用Gradle编译jar,它在java.library.path中使用DLL

时间:2017-05-10 19:14:22

标签: java intellij-idea gradle dll jar

我正在尝试使用Gradle编译一个jar文件并且它工作正常,除非我运行jar时因为在java.library.path中找不到EvalC.dll而得到UnsatisfiedLinkError。

当我使用Gradle在IntelliJ中运行项目时,我只需指定以下Gradle任务,它就可以正常工作:

systemProperty "java.library.path", "$projectDir\\libs"

我在Gradle任务中添加了相同的行来构建jar但是没有用。

我也尝试添加

static
{
    System.setProperty("java.library.path", "libs");
}

到我的主课,但那也不起作用。它也不能使用完整路径。 libs目录与src和资源等一起位于项目文件夹中,因此路径为/ ProjectFolder / libs,/ ProjectFolder / src等。

我知道我可以在命令行中指定java.library.path(我没有尝试过,因为它不是我想要的)。用户需要能够双击jar并运行它。

在不指定命令行参数的情况下,正确找到EvalC.dll的正确方法是什么?我不介意是通过代码还是通过Gradle任务。

编辑 - 最小例子:

public class TestApp extends Application
{
    private static void loadJarDLL(String name) throws IOException
    {
        InputStream in = TestApp.class.getResourceAsStream(name);
        byte[] buffer = new byte[1024];
        int read;
        File temp = File.createTempFile(name, "");
        FileOutputStream fos = new FileOutputStream(temp);

        while((read = in.read(buffer)) != -1)
        {
            fos.write(buffer, 0, read);
        }

        fos.close();
        in.close();

        System.load(temp.getAbsolutePath());
    }

    public static void main(String[] args)
    {
        launch(args);
    }

    int numPlayers = 3;
    int[] playerHands = {3, 14, 2, 6, 3, 2, 8, 4, 8, 3, 7, 2, 3, 3, 2};
    int[] comCards = {11, 2, 4, 1, 10, 2, 8, 2, 2, 1};

    public static native int[] evaluateCards(int playersSize, int[] playerHands, int[] comCards);

    @Override
    public void start(Stage stage) throws IOException
    {
        try
        {
            loadJarDLL("EvalC.dll");
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }

        evaluateCards(numPlayers, playerHands, comCards);
    }
}

Gradle Run:

run
{
    systemProperty "java.library.path", "$projectDir\\libs"
}

Gradle Build Jar:

jar
{
    manifest
    {
        attributes 'Main-Class': "$mainClassName"
    }
    from
    {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
    destinationDir = file("$rootDir/bin")
}

编辑2 - 链接下载压缩示例项目:

https://drive.google.com/open?id=0B3-S5JAgvkPDTDlKOXlNYWxwdmc

0 个答案:

没有答案