gpt4 book ai didi

java - 将 JNA 指针从一个 Java 应用程序发送到另一个 Java 应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:45 29 4
gpt4 key购买 nike

我有一个客户端和一个服务器应用程序。客户端向服务器发送String命令,服务器使用JNA对两个DLL库接口(interface)进行相关调用。自然地,在某些时候我会被要求在事物的 java 端使用指针。我无法通过套接字连接发送指针对象,因为它们不可序列化。为了解决这个问题,我想我会使用 Pointer.nativeValue(p) 获取 Pointer 的 native long 值,通过连接发送该 long 值并使用它在客户端创建一个新的 Pointer。但是,尽管客户端的指针对象与服务器端的指针对象具有相同的 native 值,但它并未指向客户端的任何内容,因此我收到无效内存访问错误。

现在,在我的客户端应用程序中,我使用 JavaFX 创建一个窗口,我的 DLL 可以在其中绘制,因此我必须获取 JavaFX 窗口的 HWND。然后我要做的是将 JNA 的 HWND 对象的 native 值发送到服务器,然后服务器使用该长 native 值重新创建 HWND 对象。这样可行。但显然 Pointer 和其他类似的 JNA 对象没有。我认为那些 Pointer 对象和 HWND 对象(以及 WinDef 类中的其他对象)之间的区别在于 HWND 实际上是一个 native 值,因为它来自 Windows 本身,否则它作为 native 将毫无用处窗口句柄。但我认为 JNA 指针只存在于当前运行的 JRE 中。因此,将该指针值传输到另一个 JRE(我的客户端正在运行的位置)将不起作用。我真的不是 100% 确定这一切。

我只是 C 编程的初学者,所以我不太了解指针,更不用说 Java 中的 C 指针了。但是如果我对此有正确的想法并进一步解释,特别是关于这些指针如何在 java 中工作,请有人告诉我。

这只是我所做的一个例子:

// Server side (PointerTest class)
public long getPtrVal() {
Pointer p = new Memory(100);
p.setString(0, "Test");
long ptrVal = Pointer.nativeValue(p);
return ptrVal; // return value is processed in separate class
}

// Client side (MyClient sends String command, returns Object)
public static void main(String[] args) {
MyClient c = new MyClient();
long ret = (long) c.sendCommand("PointerTest");
Pointer p = new Pointer(ret);
String pointerString = p.getString(0);
System.out.println(pointerString);
}

我也尝试过使用 IntByReference。虽然它没有像 Pointer 对象那样抛出错误,但在服务器端设置的值为 1234,但我在客户端获得的值为 0。

最佳答案

指针的值是进程地址空间中的一个地址。在具有虚拟内存子系统(包括您将遇到的所有通用操作系统,尤其是 Windows)的操作系统上,这样的地址本质上是特定于进程的。一个进程无法访问另一个进程的内存,无论是通过指针还是其他方式。这种内存保护是一种有意且非常理想的功能。

另一方面,给定的操作系统可能会提供具有机器范围的资源。在 MS Windows 上,窗口就是这样一种资源,它的句柄为每个进程指定相同的窗口。

关于java - 将 JNA 指针从一个 Java 应用程序发送到另一个 Java 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938760/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com