Java 在64位操作系统上使用32位JVM的JNA

Java 在64位操作系统上使用32位JVM的JNA,java,windows-7,32bit-64bit,jna,Java,Windows 7,32bit 64bit,Jna,我想使用我开发的专有库(DLL)升级设备。该库使用MFC应用程序运行良好。然而,这里的转折点是,我们必须在浏览器中实现这一点 我的想法是使用一个小程序,然后调用本机DLL使其工作。我的测试Java应用程序一切正常。然后我尝试了小程序,但什么都没用 我已经将问题缩小到32位对64位JVM。让我解释一下:我使用的Eclipse IDE使用了64位JVM,因为我使用的是Windows7 64位。但是,浏览器使用的是32位JVM,这不起作用 两者之间的区别是传递给我的函数的参数。以下是DLL公开的函数的

我想使用我开发的专有库(DLL)升级设备。该库使用MFC应用程序运行良好。然而,这里的转折点是,我们必须在浏览器中实现这一点

我的想法是使用一个小程序,然后调用本机DLL使其工作。我的测试Java应用程序一切正常。然后我尝试了小程序,但什么都没用

我已经将问题缩小到32位对64位JVM。让我解释一下:我使用的Eclipse IDE使用了64位JVM,因为我使用的是Windows7 64位。但是,浏览器使用的是32位JVM,这不起作用

两者之间的区别是传递给我的函数的参数。以下是DLL公开的函数的一些示例:

bool UPGRADELIB_API Connect(const char*serverAddress,无符号短serverPort);
bool UPGRADELIB_API升级(const char*pFilePath);
在Java中分别通过以下方式匹配:

boolean图标\u ConnectClientNode(字符串serverAddress,int serverPort);
布尔图标_升级(字符串pFilePath);
我的Java测试GUI将IP地址传递到本机库“192.168.x.x”
,端口传递到本机库50005。在64位中,正如我前面所说的,一切都很好。在32位中,如果我用C打印serverAddress和serverPort,它会显示

(空):62384

如您所见,即使端口也没有正确传递


我已经做了一个星期了,我的头发太多了,很快就不会有了。。。请帮帮我

发现错误:正在传递一个long,Java long的大小与C/C++long的32位和64位不同


我真傻。

也许用long代替字符串可以解决您的问题,因为在Java中,long变量总是64位。然后将字节转换成字符串格式,安装一个32位JVM(甚至是32位版本的eclipse)并进行测试。一旦它正常工作,那么您就可以转到让它在浏览器中工作的问题了。@technomage我在帖子中忘了提到,我已经在Eclipse中测试了32位JVM。Eclipse中的64位JVM可以工作,但32位JVM不行。我的猜测是64位操作系统->64位JVM=没问题,但64位操作系统->32位JVM=未对齐?操作系统没有区别;32位运行的JVM将使用操作系统的32位子系统(JNA将加载其32位本机代码,如果本机代码正在运行,还将加载32位版本的代码)。仔细查看您正在使用的任何Windows API,看看这些文档是否表明64位和32位操作之间的行为差异。Java端的serverAddress是否为null,或者null值是否来自C代码使用serverAddress作为输入进行的某个网络API调用?@technomage在DLL函数中为null(int是错误的)。我没有在DLL中使用任何Windows API,这就是为什么它如此令人惊讶的原因。如果我对64位JVM进行完全相同的调用,服务器地址和端口都是有效的,一切都正常。