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

标签 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 的示例。因此,您使用生成的头文件中的签名实现 native 方法。 但是这里我们已经有了一个 dll。

谢谢!

最佳答案

您所看到的示例是最好的方法。需要完成一些线束代码以使 Java 能够调用 native 方法,反之亦然。没有这个 harness 代码,他们中的任何一个都无法相互通信。

如果您迫不及待地想调用 CopyFileA,那么请在一些 C/C++ 代码中创建线束代码,然后调用 CopyFileA。

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

可能有第三方代码可以帮助您。我一个都不知道。

关于java - 从现有外部 .dll 调用方法。例如,来自 kernel32.dll 的 CopyFileA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7158777/

相关文章:

java - spring boot从1.3.5更新到1.5.17后找不到log4j库

java - 在 Java 中加载 .DLL

c# - 从 C# 调用 Delphi 6 DLL 会导致不同的舍入?

java - 使用 JNI 实现 Swing 透明度

java - JSF 2.0 : How to redirect to the protected page after using HttpServletRequest. 登录

java - java 应用程序运行时 jar 文件输入 == null

java - HashMap 空间复杂度

c++ - 延迟加载 crypto++ cryptopp.dll

android - APK:与版本号相关的 native 库名称问题 (SO.X.Y)

java - jni native 函数重载签名