Функция вызова Java из библиотеки DLL - PullRequest
0 голосов
/ 23 октября 2018

У меня есть скрипт Python, который импортирует zkemkeeper dll и подключается к устройству учета рабочего времени (ZKTeco).Вот скрипт, который я использую:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM")
zk.Connect_Net("192.168.0.17", 4370)
print(zk.StartIdentify())
print(zk.StartEnrollEx(7, 2, 1))

Это работает нормально, как и ожидалось.Однако я хочу добиться того же, используя Java.Как я могу назвать этот Connect_Net метод?Я попробовал следующее в Java, но не сработало:

public class ZKEM {

    static {
        System.loadLibrary("zkemkeeper");
    }

    ZKEM() {
    }

    public static native boolean Connect_Net(String IPAdd, int Portl);

}

public class Main {

    public static void main(String[] args) {

        System.err.println(ZKEM.Connect_Net("192.168.0.17", 4370));
    }

}

1 Ответ

0 голосов
/ 23 октября 2018

Два варианта вызова нативного кода из Java: JNI (собственный интерфейс Java) и JNA (собственный доступ Java)

JNI может выполнять среда выполнения Javaиз коробки, но вам нужно создать библиотеку-оболочку с функциями, специально созданными для JNI (недостаточно просто ввести ключевое слово native.

JNA - сторонняя библиотека, которая использует libffi , чтобы сделать нативный код доступным из Java.

Вы должны сами убедиться, какой подход лучше соответствует вашим потребностям.

Редактировать: еще раз посмотрев на пример кода, является ли COMвызов?Хотя COM можно сделать с помощью JNA (я делаю это сам), это довольно сложно.Лучше всего, вероятно, использовать библиотеку C-оболочки, которая выполняет фактические вызовы, или продукт моста Java / COM, такой как JACOB (однако, никогда не использовал его).

...