来自 dll 的 Java 调用函数

2024-06-20

我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备(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));
    }

}

从 Java 调用本机代码的两种选择是JNI(Java 本机接口) https://docs.oracle.com/en/java/javase/11/docs/specs/jni/index.html and JNA(Java 本机访问) https://github.com/java-native-access/jna

Java 运行时可以开箱即用地执行 JNI,但您需要创建一个包装器库,其中包含专门为 JNI 制作的函数(只需放入一个native关键字是不够的)。

JNA 是一个第三方库,它使用libffi https://sourceware.org/libffi/使本机代码可以从 Java 访问。

您必须亲自看看哪种方法更适合您的需求。

编辑:再次查看示例代码,这是 COM 调用吗?虽然 COM 可以用 JNA 来完成(我自己就是这么做的),但它相当复杂。您最好的选择可能是执行实际调用的包装 C 库或 Java/COM 桥接产品,例如JACOB https://sourceforge.net/projects/jacob-project/(但是从未使用过它)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 dll 的 Java 调用函数 的相关文章

随机推荐