无法使用 JNA:com.sun.jna.Library 无法访问

vic*_*sch 5 java jna java-platform-module-system java-module

我正在尝试使用 JNA,因为我想使用用 C++ 编写的 .dll,而其余代码是用 Java 编写的。但是,如果我尝试导入 JNA 类,Eclipse 会声明“com.sun.jna.Library 类型不可访问”。

我的 IDE 似乎发现 JNA 以某种方式存在于我的库中,因为当我输入“import com.sun.j”时,它会向我推荐 .jna 和 .jar 文件中的其他包。

我创建了一个单独的项目来看看它是否在那里工作,但它就是不起作用。

我已经从 jna Github( https://github.com/java-native-access/jna/blob/)下载了最新的 .jar(jna-5.8.0.jar 和 jna-platform-5.8.0.jar)文件master/README.md),我已通过项目 - >配置构建路径 - >添加外部JAR将它们添加到类路径中

我正在使用 Eclipse 和 javaSE-13。

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

    }
}
Run Code Online (Sandbox Code Playgroud)

封装结构:

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
Run Code Online (Sandbox Code Playgroud)

Dan*_*dis 5

正如@greg-449module-info.java在评论中提到的,您有一个模块化项目,由目录(包根目录)中存在该文件表明src

您在这里有三个选择:

  • 在 JRE 8 或更早版本上运行(或将项目兼容性级别更改为),该版本会忽略module-info.java
  • 删除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.0JAR 作为依赖项,因为它们有自己的模块描述符。