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

标签 java java-native-interface jna

我有一个使用 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/

相关文章:

java - 如何使用 JPA 2.0 保留子类型列表?

java - 两次调用方法类;一次用于行,然后用于列

java - 找不到 GOOGLE_APPLICATION_CREDENTIALS

java - 通过命令行与 JNI 调用

java - JNA Windows 服务启动类型

java - 如何使 GetLastError 可靠地与 JNA 一起工作?

java - 如何将 url 中的图像加载到 viewpager2 中?

java - JNI : best way to pass global variable to-and-fro with smallest overhead?

android - 在 Android 游戏中将 java.nio.IntBuffer 传递给 C 函数

java - 使用 JNA 调用 CreateFile 给出 UnsatisfiedLinkError : Error looking up function 'CreateFile' : The specified procedure could not be found