我正在尝试访问.dll文件中可用的功能。但它给出了异常,比如“线程中的异常”主“java.lang.UnsatisfiedLinkError:* .jniGetAudioInputLevel()D”。 DLL文件已加载,但是当我尝试访问这些方法时,它会给出错误消息。
根据我的知识: -
如何通过任何其他想法配置此功能的可访问性?
答案 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文件时,我们会收到此异常。