Java(JNA) – 在DLL(C ++)库中找不到函数

我是Java新手,在google和stackoverflow中搜索了这个问题,发现了一些post,但我仍然无法理解。

我想使用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

谢谢你的回复!

PS我找到了很好的例子http://tutortutor.ca/cgi-bin/makepage.cgi?/articles/rjna (清单6)。

我要说你需要应用正确的名称映射器,因为你注意到函数名被破坏了,你需要注册将实现与编译器相同的修改的CallMapper

这是来自JNA主页的重要条目:

使用转储实用程序检查导出函数的名称以确保它们匹配(linux上的nm,取决于Windows)。 在Windows上,如果函数具有“@NN”forms的后缀,则在初始化库接口时需要传递StdCallFunctionMapper作为选项。 通常,您可以使用函数映射器(FunctionMapper)来更改查找方法的名称,或使用调用映射器(InvocationMapper)来更广泛地控制方法调用。

这是一个可能引人注目的问题: 使用StdCallFunctionMapper在JNA中重命名DLL函数