java - 无法使用 JNA : com. sun.jna.Library 不可访问

标签 java jna java-module java-platform-module-system

我正在尝试使用 JNA,因为我想使用一个用 c++ 编写的 .dll,而我的其余代码是用 Java 编写的。但是,如果我尝试导入 JNA 类 Eclipse 声称“com.sun.jna.Library 类型不可访问”。
我的 IDE 似乎发现 JNA 在我的库中,因为当我键入“i​​mport com.sun.j”时,它会向我建议 .jna 和 .jar 文件中的其他包。
我创建了一个单独的项目来查看它是否在那里工作,但它只是不起作用。
我从 jna Github ( https://github.com/java-native-access/jna/blob/master/README.md ) 下载了最新的 .jar (jna-5.8.0.jar 和 jna-platform-5.8.0.jar) 文件,并通过 project-> configure 将它们添加到类路径中构建路径 -> 添加外部 JAR
我正在使用带有 javaSE-13 的 Eclipse。

package Testtest;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }
}
封装结构:
Test
 |-- src
 |   |-- TestTest
 |   |   |-- Main.java
 |   |-- module-info.java
 |-- JRE System Library [JavaSE-13]
 |-- Referenced Libraries
     |-- jna-5.8.0.jar
     |-- jna-platform-5.8.0.jar

最佳答案

@greg-449评论中提到,您有一个模块化项目,由 module-info.java 的存在表示。文件在您的src目录(包根目录)。
您在这里有三个选择:

  • 在忽略 module-info.java 的 JRE 8 或更早版本上运行(或将您的项目兼容级别更改为)
  • 删除module-info.java模块描述符,以便在没有模块的情况下运行您的程序
  • 编辑你的模块描述符( module-info.java )添加指令 requires com.sun.jna .如果您使用 jna-platform然后还添加 requires com.sun.jna.platform .
  • 此外,如果您扩展任何 JNA 类,如 StructurePointerType您将需要 open项目中包含 com.sun.jna 的那些子类的任何包因为他们使用反射来访问您的子类。 (这里有多个选项,但 open TestTest to com.sun.jna 是最接近 JDK8 的行为。)。我知道这只是一个测试设置,但考虑一个反向 DNS 样式的包名称和模块描述符。
  • 如果您在模块路径上使用 JNA,您可能更喜欢使用 jna-jpms-5.8.0jna-platform-jpms-5.8.0 JAR 作为您的依赖项,因为它们有自己的模块描述符。

  • 关于java - 无法使用 JNA : com. sun.jna.Library 不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67401972/

    相关文章:

    Java 扫描器输入数组

    java - 访问控制-j2ee

    java - Java 中的数组求和与平均值

    java - 带有模块的 Java 11 Gradle

    java - 如何定义对未知模块的合格导出?

    java - 将 JButton 放入堆栈中

    java - 使用 JNA 检测 HICON 的尺寸

    java - 返回和访问 jna 中结构对象的数组

    java - 从当前 COME 后期绑定(bind)对象获取进程 ID

    java - 如何获取未命名模块的 Java 9 ModuleReference