Yuv*_*ory 3 c dll jna visual-studio
我已经在Linux和Mac上成功编译了我的库,并将其与Java Native Access一起使用。不幸的是,我似乎无法对Visual Studio的编译器和Java Native Access进行任何操作。
我将回到基础知识,并尝试在Visual Studio中创建Java Native Access可以使用的超简单dll,我们将不胜感激。
这是GimmeFiveDll.c:
__declspec(dllexport) int gimmeFive()
{
return 5;
}
Run Code Online (Sandbox Code Playgroud)
这是SystemLibrary.java:
import com.sun.jna.Native;
public class SystemLibrary {
public static final SystemLibrary instance = new SystemLibrary();
static {
Native.register("GimmeFiveDll");
}
public native int gimmeFive();
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试在Visual Studio中将调用接口切换为stdcall。我没有从新项目向导的空项目dll win32控制台默认值中进行任何其他更改。在上面的示例中,生成的dll甚至没有根据正确导出函数dumpbin.exe /exports。我的真实项目确实正确导出了它们,但是无论哪种方式,我总是会得到相同的JNA异常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'GimmeFiveDll': The specified module could not be found.
Run Code Online (Sandbox Code Playgroud)
(是的,我将GimmeFiveDll.dll放入System32中。是的,我能够使用JNA来访问Windows随附的System32中的其他dll)。
是否有人愿意帮助我完善一下JNA喜欢的Visual Studio创建的dll的极简示例?
非常感谢。
在将我的头撞在墙上两天后,我想通了。问题在于C:\ Windows \ System32不是目录System.loadLibrary()(Native.register()使用该目录)可以从64位计算机上加载dll!因此,JNA显然试图将库复制到一个临时位置并加载它,但是失败了。“找不到指定的模块”消息不是非常有用,并且使我走错了轨道:-\
无论如何要回答我自己的问题,这里是一个可以用MSVC构建的dll的示例,Java(和JNA)可以使用它(只需将其放在系统的正确目录中即可!):
GimmeFiveDll.c:
#ifdef __cplusplus
#error no C++, to keep this example simple
#endif
__declspec(dllexport) int gimmeFive()
{
return 5;
}
Run Code Online (Sandbox Code Playgroud)
DllTest.java:
import com.sun.jna.Native;
public class DllTest {
static {
Native.register("GimmeFiveDll");
}
public static native int gimmeFive();
public static void main(String[] args) {
System.out.println("I got: " + DllTest.gimmeFive());
}
}
Run Code Online (Sandbox Code Playgroud)
如果一切顺利,Java将显示“ I got:5”。
请注意,我发现没有必要更改编译器设置以使用stdcall或在函数签名中声明__stdcall。实际上,向导创建的常规空dll项目不需要更改编译器。
| 归档时间: |
|
| 查看次数: |
2976 次 |
| 最近记录: |