试图在Visual Studio中制作Java Native Access将接受的“ Hello Word” dll

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的极简示例?

非常感谢。

Yuv*_*ory 5

在将我的头撞在墙上两天后,我想通了。问题在于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项目不需要更改编译器。