【发布时间】:2012-04-24 05:44:09
【问题描述】:
JNA 和 DLL 对我来说是全新的领域...我有一个自定义 DLL,它有一个带有此声明的函数:
int myfunc (const char*);
使用以下命令在 MinGW 下 dll 可以正常编译:
>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 文档完全没有帮助。老实说,我已经不知道自己在做什么了。
【问题讨论】:
-
从字面上看,您遇到了什么特别的错误?
-
你设置
-Djna.library.path=<path location of your DLLs/libraries>了吗? -
您应该提供您看到的实际异常,这将指出问题所在。
-
遵循 Java 约定并使用大写字母和大小写混合命名类(例如 MyDLL.class)。如果您不这样做,则表明您是 Java 新手,并没有真正关注。
-
除非有特定理由,否则不要使用 stdcall。如果你确实使用了stdcall,你可以通过告诉gcc使用“-Wl,add-stdcall-alias”来包含未修饰的名称来避免函数映射器。
标签: java c dll jna unsatisfiedlinkerror