gpt4 book ai didi

java - 我可以将 JNA 与 JNI 混合使用吗

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:28:59 25 4
gpt4 key购买 nike

我有一个使用 JNA 从 Java 访问的自定义 dll。到目前为止,一切都很完美。但是现在我想从我的 C 代码创建 Java 类。我假设这不能用 JNA 完成,所以我所做的是创建一个 JNI 方法,但这导致我遇到 UnsatisfiedLinkError。所以我的问题是:在访问同一个 DLL 时我可以混合使用 JNA 和 JNI 吗?如果可以,我应该怎么做?

最佳答案

当然,您可以混合访问 DLL,因为它只加载一次。问题是如何链接到您的应用程序:

JNA:

当使用 JNA 时,您调用 jna 库的本地函数,这些函数通过某种反射绑定(bind)到您的 DLL 中的函数。这样做的好处是您不必担心 DLL 中函数的名称,它们不必符合任何约定。

JNI:

简单的工作方式是将您的 Java 类映射到 DLL 中预期的方法名称。如果你有一个类 com.company.SomeClass 包含一个函数 int doStuff(int i, long john) 带有这个签名:

JNIEXPORT jint JNICALL Java_SomeClass_doStuff(JNIEnv *env, jint i, jlong john) {
return ...whatever...
}

如果缺少此函数,您将收到 UnsatisfiedLinkException。

解决方案:

因为看起来你已经编写了自己的 DLL,只需将所需的函数添加为包装函数即可,你就完成了。要获得函数签名,您可以使用 javah 命令自动创建一个头文件。

我推荐阅读 Advanced Programming for the Java 2 Platform - Chapter 5: JNI Technology .

关于java - 我可以将 JNA 与 JNI 混合使用吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com