java - JNA 找不到函数

标签 java c dll jna unsatisfiedlinkerror

JNA 和 DLL 对我来说是全新的领域...我有一个自定义 DLL,它的函数声明如下:

int myfunc (const char*);

dll 在 MinGW 下使用以下命令可以正常编译:

>gcc -shared -omydll.dll mydll.c -lgdi32

但是,使用 JNA 加载它会失败,因为它无法在 DLL 中找到该函数。

public interface mydll extends StdCallLibrary {
  mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class);
  int myfunc (String arg);
  }

我做了一些研究,似乎这个特定的错误与 DLL 函数的调用过程有关。我看过 __stdcall__cdecl 过程。我还看到许多 DLL 函数将 __declspec(dllexport) 放在它们的函数声明/实现之前(我不知道这意味着什么或它做了什么)。所以,由于 JNA 似乎更喜欢 __stdcall 过程,现在我的函数看起来像这样:

__declspec(dllexport) int __stdcall myfunc (const char*);

这看起来 super 复杂,但并不比我尝试过的任何其他方法更好。使用 HashMap 添加下划线前缀和 @4 后缀也不起作用:

mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class, new HashMap () {{
  add("myfunc", "_myfunc@4");
  }});

JNA 文档完全没有帮助。老实说,我不知道自己在做什么了。

最佳答案

事实证明,我正在构建我的 DLL,而且 JNA 也发现我的 DLL 也很好;我在确定编译器如何破坏我的符号时犯了一个错误。我命名为 myfunc 的函数被导出为 myfunc@8myfunc@32取决于他们将多少字节作为参数。这是我在 JNA 项目中使用的代码:

import java.util.*;
import com.sun.jna.*;
import com.sun.jna.win32.*;
//
public class Test
  {
  public interface mydll extends StdCallLibrary
    {
    mydll INSTANCE = Native.loadLibrary("mydll", mydll.class, new HashMap {{
      put("myfunc", "myfunc@8");
      //Other functions
      }});
    public int myfunc (long arg);
    //Other functions
    }
  //
  public static void main (String[] args)
    {
    System.out.println
      (mydll.INSTANCE.myfunc((long)0x23A3920F)); //Or whatever
    return 0;
    }
  }

我的 C 代码:

#include <windows.h>
#include <stdio.h>

__declspec(dllexport) int __stdcall myfunc (__int64);
/* Other functions */

__declspec(dllexport) int __stdcall myfunc (__int64 arg)
  {
  /* Whatever */
  return return_value;
  }

GCC 对 -shared 很满意切换并链接到正确的库,就像我原来的问题一样。 我强烈推荐下载this tool这样您就可以准确地找到您的函数名称。

关于java - JNA 找不到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10292338/

相关文章:

java - 线程 "main"java.lang.Error : Unresolved compilation 中出现异常

java - 如何在 Windows 上设置 JUNIT 以使用 Sublime 和命令行?

java - 大型项目代码格式化的最佳实践

c - for循环中的数组,C99

c++ - 在给定模块句柄的情况下枚举模块的段

c# - 使用任务管理器终止程序时收到的消息

java - 查找移动到不同位置的文件的新位置 - Java

c - 如何防止 gcc 优化器产生不正确的位操作?

c++ - 使用 DEF 从 Visual Studio 2010 中的 DLL 导出函数

c++ - 如何从正在运行的 VC++ 项目生成 DLL?