2010-02-12 64 views
4

我想要访问.dll文件中可用的函数。但它给出了异常,如“线程中的异常”main“java.lang.UnsatisfiedLinkError:* .jniGetAudioInputLevel()D”。 DLL文件被加载,但是当我尝试访问它给出错误消息的方法。java.lang.UnsatisfiedLinkError:dll内的方法不可访问

据我了解: -

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

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

回答

0

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

6

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

例如,

package com.mycompany.stuff; 

public native void doSomething(); 

需要(取决于您的系统DLL,所以,* SRVPGM等)的本地库中找到并装载的System.loadLibrary(),其中包含并导出的函数命名为

com_mycompany_stuff_doSomething 

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

4

我同意软件猴,但我有一个非常重要的功能名称相关的添加。本地库中的函数名称应该从'_Java_'开始。你的情况应该是:

_Java_com_mycompany_stuff_doSomething 

,我发现它的机会,并花了两天时间来弄清楚为什么JVM找不到在DLL中的函数,如果它的存在。在我的情况下,javah在'Java_'之前生成带有函数名称的头文件,并且没有下划线符号。因此,我必须手动更新它才能使其正常工作。

我想知道为什么没有提到Java C 6 Documentation提供的“Java本地接口:程序员指南和规范”,“Java本机接口6.0规范”中的下划线前缀(我使用jdk 1.6.0_30,但是JDK版本不应该成为问题)和其他一些资源。

+1

在Mac OS X上,前缀似乎为“Java_”,但在Windows XP上为“\ _Java \ _”。 – Evan 2012-04-16 01:52:27

+0

埃文,你也许是对的。我没有提到我在Windows 7上工作。不幸的是,我没有Mac在OS X下试用它。但是我很困惑为什么这么小但非常重要的音符不在所提到的规格中。 – vovanst 2012-05-04 12:57:18