【发布时间】:2011-03-22 09:11:32
【问题描述】:
我正在尝试在 Java 中使用本机 C++ 库。
当我用
加载它时System.loadLibrary(filename);
我得到错误:
java.lang.UnsatisfiedLinkError: 不应出现目录分隔符 在库名中:C:\HelloWorld.dll
有什么办法可以解决这个问题吗?
【问题讨论】:
我正在尝试在 Java 中使用本机 C++ 库。
当我用
加载它时System.loadLibrary(filename);
我得到错误:
java.lang.UnsatisfiedLinkError: 不应出现目录分隔符 在库名中:C:\HelloWorld.dll
有什么办法可以解决这个问题吗?
【问题讨论】:
只需使用:
System.loadLibrary("HelloWorld"); // without c:\ and without ".dll" extension
另外,请确保 HelloWorld.dll 在您的库路径中可用。
【讨论】:
【讨论】:
我使用 JNA 来做到这一点...
JNA 是一种调用 Native 函数的简单方法,它提供了对完成此任务有用的 NativeLibrary 类:
//调用原生函数的Java代码
dll = NativeLibrary.getInstance(Mydll);
Function proxy;
proxy = dll.getFunction(Utils.getMethods().get("MyMethodEntryPoint"));
byte result[] = new byte[256];
int maxLen = 250;
String strVer = "";
Object[] par = new Object[]{result, maxLen};
intRet = (Integer) proxy.invoke(Integer.class, par);
if (intRet == 0) {
strVer = Utils.byteToString(result);
}
你可以在http://jna.java.net/找到文档
【讨论】:
令人惊讶的是,也可以使用以下内容:
final File dll = new File("src/lib/Tester32.dll");
Test32 test32 = (Test32) Native.loadLibrary(dll.getAbsolutePath(), Test32.class);
System.out.println(test32.toString() + " - " + test32.GetLastError());
它输出:
Proxy interface to Native Library <C:\workspace\jna\src\lib\Tester32.dll@387842048> - 0
Javadoc 说:
加载库
公共静态对象 loadLibrary(字符串名称, 类接口Class)
将库接口映射到给定的 共享库,提供显式 接口类。如果名称为空, 尝试映射到当前 过程。
如果我将.\src\lib 文件夹中的Tester32.dll 重命名为其他名称,则会出现以下异常:
线程“main”中的异常 java.lang.UnsatisfiedLinkError:无法 加载库 'C:\workspace\jna\src\lib\Tester32.dll': 指定的模块不能是 找到了。
【讨论】: