我正在尝试使用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