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

时间:2013-01-13 14:40:09

标签: java dll jna

我是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)。

1 个答案:

答案 0 :(得分:3)

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

这是一个重要的条目from JNA homepage

  

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

这是一个可能引人注目的问题:renaming DLL functions in JNA using StdCallFunctionMapper