在64位操作系统上使用32位JVM的JNA技术问题

3
我想要使用我开发的专有库(DLL)升级设备,该库在MFC应用程序中运行良好。但是问题是,我们必须使其在浏览器中工作。我的想法是使用小程序,然后调用本地DLL以使其工作。我的测试Java应用程序完全正常,但是使用小程序时就无法正常工作了。我已经将问题缩小到32位VS 64位JVM上。让我来解释一下: 我正在使用的Eclipse IDE使用64位JVM,因为我使用的是Windows 7 64位。然而,浏览器使用32位JVM,这不起作用。两者之间的区别在于传递给我的函数的参数。下面是DLL公开的一些函数的示例:
bool UPGRADELIB_API Connect( const char* serverAddress, unsigned short serverPort );
bool UPGRADELIB_API Upgrade( const char* pFilePath );

在Java中分别使用以下方式匹配:

boolean Icon_ConnectClientNode( String serverAddress, int serverPort );
boolean Icon_Upgrade( String pFilePath );

我的Java测试GUI将IP地址设置为本地库中的"192.168.x.x",端口设置为50005。在64位系统上一切正常,如我之前所说。但在32位系统上,如果我在C中打印serverAddress和serverPort,将显示:

(null):62384

可以看到,甚至端口也没有正确传递。

我已经这样做了一个星期了,现在愁得快没头发了......请帮帮我!


也许在Java中使用long变量而不是字符串可以解决您的问题,因为long变量始终为64位。然后只需将字节转换为字符串格式即可。 - Francis P
安装32位的JVM(或者32位版本的Eclipse),并在其上进行测试。一旦测试通过,再考虑如何在浏览器中运行。 - technomage
操作系统不会有任何影响;在32位的JVM中运行将使用操作系统的32位子系统(并且JNA将加载其32位本机库,如果您的本机代码正在运行,则也将使用32位版本的代码)。仔细查看您正在使用的任何Windows API,以查看文档是否指示64位和32位操作之间的行为差异。服务器地址在Java端是null,还是空值来自使用serverAddress作为输入的C代码所做的某些网络API调用? - technomage
@technomage 在 DLL 函数中,它是 null(且 int 是错误的)。我在 DLL 中没有使用任何 Windows API,这就是为什么这么令人惊讶。如果我使用 64 位 JVM 进行完全相同的调用,则 serverAddress 和端口是有效的,一切都很好。 - murphyalexandre
@murphyalexandre 请发布您自己的答案,以便将其标记为已回答。 - Duncan Jones
显示剩余10条评论
1个回答

0
发现错误:传递的是Java long类型,但在32位和64位的C/C++中long类型大小不同。
我真傻。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接