Java 附加 API : UnsatisfiedLinkError

标签 java linux java-native-interface dynamic-linking jvmti

当使用 Java Attach API 时,我只在 Linux 上收到以下链接错误(在不同的机器上试过):

Exception in thread "main" java.lang.UnsatisfiedLinkError: sun.tools.attach.WindowsAttachProvider.tempPath()Ljava/lang/String;
        at sun.tools.attach.WindowsAttachProvider.tempPath(Native Method)
        at sun.tools.attach.WindowsAttachProvider.isTempPathSecure(WindowsAttachProvider.java:74)
        at sun.tools.attach.WindowsAttachProvider.listVirtualMachines(WindowsAttachProvider.java:58)
        at com.sun.tools.attach.VirtualMachine.list(VirtualMachine.java:134)
        at sun.tools.jconsole.LocalVirtualMachine.getAttachableVMs(LocalVirtualMachine.java:151)
        at sun.tools.jconsole.LocalVirtualMachine.getAllVirtualMachines(LocalVirtualMachine.java:110)
        ...

有趣的是,在 Solaris 和 Windows 上它可以开箱即用

我尝试了几种指定 java.library.path 的组合以指向包含 libattach.so 的目录,但没有成功。

这是怎么回事?

还有一个额外的问题:
有没有办法查看哪个 native 库实际绑定(bind)到 java 类?

最佳答案

不同的平台使用不同的AttachProvider。在 Linux 上,它不应使用 sun.tools.attach.WindowsAttachProvider。它适用于 Windows。

[solaris] sun.tools.attach.SolarisAttachProvider
[windows] sun.tools.attach.WindowsAttachProvider
[linux]   sun.tools.attach.LinuxAttachProvider

这是在资源文件 META-INF\services\com.sun.tools.attach.spi.AttachProvider 中配置的(通常此文件存在于 tools.jar 中)。它将搜索 CLASSPATH 以获取此资源文件的第一次出现,并从中读取 AttachProvider 实现类。

因此,您可能可以通过在 CLASSPATH 中搜索 sun.tools.attach.WindowsAttachProvider 来解决此问题。可能您包含了来自 Windows 的 tools.jar。

关于Java 附加 API : UnsatisfiedLinkError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15290526/

相关文章:

java - 如何在 spring boot 中获得可重现的 Pbkdf2PasswordEncoder 输出?

java - 合并两个不同列表对象的列表,将对象的内容放入第三个对象列表中,其中包含前两个Java中的字段

java - LinkedHashMap LRU 缓存 - 确定删除了哪些值?

java - tomcat重启后没有创建日志文件

json - 在 docker-compose.yml 中传递 Json 文件内容

java - 如何在 ASM 中编写 native 代码

java - 如何在 DllMain 调用中维护 JVM 指针并防止调用 JNI_CreateJavaVM 两次

linux - 混合远程期望脚本和本地 bash 命令的最佳方法是什么?

linux - wsdl2h 无法连接到 https

java - 使用 SWIG 的 C 函数的 JNI 包装器 - 类型映射应该是什么?