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*);
这看起来超级复杂,但并不比我尝试过的任何其他方法更好。使用 HashMap 添加下划线前缀和 @4 后缀也不起作用:
mydll INSTANCE = (mydll)Native.loadLibrary("mydll", mydll.class, new HashMap () {{
add("myfunc", "_myfunc@4");
}});
JNA 文档绝对没有帮助。老实说,我不知道我在做什么了。