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

5
我正在尝试使用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/master/README.md)下载了最新的 .jar 文件(jna-5.8.0.jar和jna-platform-5.8.0.jar),并通过项目->配置Buildpath->添加外部JARs将它们添加到类路径中。
我正在使用带有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

2
你的项目中有一个 'module-info.java' 文件,这意味着你正在使用 Java 9 中引入的模块系统,这使得设置类路径更加复杂。只需删除 module-info.java 文件即可恢复到更简单的操作方式。 - greg-449
1个回答

5
正如@greg-449在评论中提到的,您有一个模块化项目,这可以通过在src目录(包根目录)中存在module-info.java文件来表示。
您有三个选择:
  • 在JRE 8或更早版本上运行(或更改项目兼容性级别),以忽略module-info.java
  • 删除module-info.java模块描述符,以便在没有模块的情况下运行程序
  • 编辑您的模块描述符(module-info.java)以添加指令requires com.sun.jna。 如果使用了jna-platform,还要添加requires com.sun.jna.platform
    • 此外,如果扩展任何JNA类,例如StructurePointerType,则需要将包含这些子类的任何项目包打开到com.sun.jna,因为它们使用反射访问您的子类。(这里有多种选择,但open TestTest to com.sun.jna是最接近JDK8行为的。)我知道这只是一个测试设置,但请考虑采用反向DNS风格的包名称和模块描述符。
    • 如果在模块路径上使用JNA,则可能更喜欢使用jna-jpms-5.8.0jna-platform-jpms-5.8.0 JAR作为依赖项,因为它们有自己的模块描述符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接