3

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

感谢您的回复!

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

4

1 回答 1

3

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

这是来自 JNA 主页的相关条目:

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

这是一个可能相关的问题:renameing DLL functions in JNA using StdCallFunctionMapper

于 2013-01-13T15:10:03.573 回答