вызов метода из существующего внешнего .dll.Например, CopyFileA из kernel32.dll - PullRequest
2 голосов
/ 23 августа 2011

Задача - вызвать метод из существующей библиотеки DLL. Я пытаюсь сделать это на примере CopyFileA из kernel32.dll.

Подпись метода:

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 ]

2 голосов
/ 23 августа 2011

Примеры, которые вы видели, - лучший путь.Есть некоторый код, который нужно сделать, чтобы Java могла вызывать нативный метод и наоборот.Без этого кода привязки невозможно, чтобы кто-либо из них мог общаться друг с другом.

Если вы отчаянно хотите вызвать CopyFileA, то создайте код привязки в некотором коде C / C ++, который затем вызывает CopyFileA.

Если вы пытаетесь избежать программирования на C / C ++, тогда у вашего java нет возможности связаться с CopyFileA.

Может быть сторонний код, который может вам помочь.Я не знаю ни одного.

0 голосов
/ 23 января 2013

Это действительно просто: все, что вам нужно, это загрузить файл jna.jar и включить его в свой проект.
Ниже я приведу фрагмент кода, как решить вашу задачу:

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);
...