我是Java的新手,在google和stackoverflow中搜索了这个问题,发现了一些帖子,但我仍然无法理解。
我想使用Java中的DLL库(C ++)方法。我为此目的使用JNA。 JNA找到了我的图书馆,但找不到我的方法:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'LoadCurrentData': The specified procedure could not be found.
我的代码:
package javaapplication1;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
public class JavaApplication1 {
public interface LibPro extends Library {
LibPro INSTANCE = (LibPro) Native.loadLibrary(
(Platform.isWindows() ? "LibPro" : "LibProLinuxPort"), LibPro.class);
public short LoadCurrentData();
}
public static void main(String[] args) {
LibPro sdll = LibPro.INSTANCE;
sdll.LoadCurrentData(); // call of void function
}
}
我用Depency Walker Tool查看了我的DLL,发现我的函数名称有前缀和后缀 - 看起来像_LoadCurrentData@0
感谢您的回复!
P.S。我找到了很好的例子http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/rjna(清单6)。
答案 0 :(得分:3)
我要说你需要应用正确的名称映射器,因为你注意到函数名被破坏了,你需要注册CallMapper
,它将实现与你的编译器相同的修改。
这是一个重要的条目from JNA homepage:
使用转储实用程序检查导出函数的名称以确保它们匹配(linux上的nm,取决于Windows)。在Windows上,如果函数具有“@NN”形式的后缀,则在初始化库接口时需要将StdCallFunctionMapper作为选项传递。通常,您可以使用函数映射器(FunctionMapper)来更改查找方法的名称,或使用调用映射器(InvocationMapper)来更广泛地控制方法调用。
这是一个可能引人注目的问题:renaming DLL functions in JNA using StdCallFunctionMapper