java.lang.UnsatisfiedLinkError:无法访问dll中的方法

时间:2010-02-12 06:39:02

标签: java java-native-interface

我正在尝试访问.dll文件中可用的功能。但它给出了异常,比如“线程中的异常”主“java.lang.UnsatisfiedLinkError:* .jniGetAudioInputLevel()D”。 DLL文件已加载,但是当我尝试访问这些方法时,它会给出错误消息。

根据我的知识: -

  • 仅当.dll不在类路径中或者jar文件中不存在dll时才会发生此异常。
  • 只有在所有代码都运行且没有任何错误的情况下才会创建
  • .dll文件。
  • 我已经使用类似工具看到了dll中的方法:Anywhere PE Viewer,PE Explorer等。它们都显示了.dll文件中可用的方法。

如何通过任何其他想法配置此功能的可访问性?

3 个答案:

答案 0 :(得分:6)

如果找不到声明为native的方法的本机副本,则也会抛出UnsatisfiedLinkError。如果未使用“_”分隔完整Java包名称命名本机代码,则很容易发生这种情况。

例如,

package com.mycompany.stuff;

public native void doSomething();

需要找到本机库(DLL,* SRVPGM等,具体取决于您的系统)并使用System.loadLibrary()加载,该系统包含并导出名为

的函数
com_mycompany_stuff_doSomething

如果您确定正在加载本机库,我的猜测是该函数未正确命名或未导出。

答案 1 :(得分:4)

我同意 Software Monkey ,但我有一个与功能名称相关的非常重要的添加内容。本机库中的函数名称应从“_Java_”开始。在你的情况下应该是:

_Java_com_mycompany_stuff_doSomething

我偶然发现它并花了两天时间弄清楚为什么JVM无法在DLL中找到该函数。在我的例子中,javah在'Java_'之前生成带有函数名称但没有下划线符号的头文件。因此,我必须手动更新它才能使其正常工作。

我想知道为什么在Java Java文档提供的“Java Native Interface:Programmer's Guide and Specification”,“Java Native Interface 6.0 Specification”中没有提到下划线前缀(我使用的是jdk 1.6.0_30,但是JDK版本不应该是问题)和其他一些资源。

答案 2 :(得分:0)

通常,当JVM找不到.dll文件时,我们会收到此异常。