从现有的外部.dll调用方法。例如,来自kernel32.dll的CopyFileA

时间:2011-08-23 09:21:59

标签: java dll java-native-interface native

任务是从现有的dll调用方法。 我试图从kernel32.dll的CopyFileA示例中做到这一点。

方法签名是:

Function long CopyFileA(String lpExistingFileName, String lpNewFileName, boolean bFailifExists) Library "kernel32"

这就是我在java中尝试这样做的方法:

public class Test {

    static {
        System.loadLibrary("D:\\test\\kernel32");
    }

    public static void main(String[] args) {
        (new Test()).CopyFileA("D:\\test\\hi.txt", "D:\\other\\hi.txt", false);
    }

    public native long CopyFileA(String lpExistingFileName, String lpNewFileName, boolean bFailifExists);
}

我得到了:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.CopyFileA(Ljava/lang/String;Ljava/lang/String;Z)J

我发现的所有手册都描述了编写C代码然后为自己创建dll的示例。因此,您使用生成的头文件中的签名实现本机方法。 但是在这里我们已经有了一个dll。

谢谢!

2 个答案:

答案 0 :(得分:2)

你看到的例子是最好的方法。需要执行一些线束代码以使Java能够调用本机方法,反之亦然。如果没有这个线束代码,他们之间就无法相互通信。

如果您急于调用CopyFileA,请在某些C / C ++代码中创建线束代码,然后调用CopyFileA。

如果您试图避免使用C / C ++编程,那么您的Java无法与CopyFileA进行通信。

可能有第三方代码可能会对您有所帮助。我不知道。

答案 1 :(得分:0)

这非常简单:您需要的一切就是下载jna.jar文件并将其包含在您的项目中 Bellow我把一些代码片段放在了如何解决你的任务:

Function showWindow = Function.getFunction("kernel32", "CopyFileA");
Object[] params = new Object[3];
params[0] = "D:\\test\\hi.txt";
params[1] = "D:\\other\\hi.txt";
params[2] = false;
Object result = showWindow.invoke(params);