dll的Java调用功能

时间:2018-10-23 08:27:43

标签: java python-3.x dll java-native-interface

我有这个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));
    }

}

2 个答案:

答案 0 :(得分:1)

从Java调用本机代码的两个选择是JNI (Java Native Interface)JNA (Java Native Access)

Java运行时可以直接使用JNI,但是您需要创建一个具有专门为JNI设计的功能的包装器库(仅放置native关键字是不够的。)

JNA是第3方库,它使用libffi使Java可以访问本机代码。

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

编辑:再次查看您的示例代码,那是一个COM调用吗?虽然COM可以使用JNA来完成(自己动手做),但它相当复杂。最好的选择可能是包装程序C库,它可以进行实际的调用,或者是Java / COM桥接产品,例如JACOB(不过,从未使用过)。

答案 1 :(得分:1)

虽然这是一篇旧帖子,但我正在完成一个纯 Java ZKEM: https://github.com/mkhoudary/ZKTeco4J

我过去在 COM4J 中使用 ZKemKeeper DLL: https://github.com/mkhoudary/ZKEMJavaPort

但是纯 Java 的真的很健壮,你可以看 repo,我在最后阶段