【发布时间】:2012-05-14 05:37:36
【问题描述】:
我想使用我开发的专有库 (DLL) 升级设备。该库使用 MFC 应用程序运行良好。然而,这里的转折点是我们必须在在浏览器中进行这项工作。
我的想法是使用一个小程序,然后调用本机 DLL 来完成这项工作。我的测试 Java 应用程序一切正常。然后我尝试使用小程序,然后没有任何效果。
我已将问题范围缩小到 32 位 VS 64 位 JVM。让我解释一下:我使用的 Eclipse IDE 使用 64bit JVM,因为我使用的是 Windows 7 64bit。但是,浏览器使用 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 传递给这个原生库 "192.168.x.x" 作为 IP 地址和 50005 作为端口。在 64bit 中,一切都很好,正如我之前所说的。在 32bit 中,如果我在 C 中打印 serverAddress 和 serverPort,它会显示
(null):62384
如你所见,连端口都没有正确传递。
我已经做了一个星期了,我从头上拔了很多头发,我很快就不会了......请帮帮我!
【问题讨论】:
-
也许使用 long 而不是字符串可以解决您的问题,因为在 Java 中,long 变量始终是 64 位。然后只需将字节转换为字符串格式。
-
安装 32 位 JVM(甚至是 32 位版本的 eclipse)并对其进行测试。一旦它正常工作,那么你可以转移到使它在浏览器中工作的问题。
-
@technomage 我忘了在帖子中提到,我已经在 Eclipse 中测试了 32 位 JVM。 Eclipse 中的 64 位 JVM 可以工作,但 32 位的却不行。我的猜测是 64bit OS -> 64bit JVM = 没问题,但是 64bit OS -> 32bit JVM = misalignment ?
-
操作系统没有区别;以 32 位运行的 JVM 将使用操作系统的 32 位子系统(JNA 将加载其 32 位本机,并且,如果您的本机代码正在运行,也将加载您的代码的 32 位版本)。仔细查看您使用的任何 Windows API,以查看文档是否表明 64 位和 32 位操作之间的行为差异。是 Java 端的 serverAddress 为 null,还是来自 C 代码使用 serverAddress 作为输入的某些网络 API 调用的 null 值?
-
@technomage 在 DLL 函数中为 null(并且 int 错误)。我没有在 DLL 中使用任何 Windows API,这就是它如此令人惊讶的原因。如果我使用 64 位 JVM 进行完全相同的调用,则 serverAddress 和端口是有效的,一切正常。
标签: java windows-7 32bit-64bit jna