当前位置: 首页 > 知识库问答 >
问题:

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

锺离俊雄
2023-03-14

我有一个客户端和一个服务器应用程序。客户端向服务器发送字符串命令,服务器使用JNA对两个DLL库接口进行相关调用。当然,在某个时候,我会被要求在java端使用指针。我无法通过套接字连接发送指针对象,因为它们是不可序列化的。为了解决这个问题,我认为我将使用Pointer.nativeValue(p)获取指针的本机长值,通过连接发送该长值,并使用它在客户端创建一个新指针。然而,尽管客户端的指针对象与服务器端的指针对象具有相同的本机值,但它并不指向客户端的任何内容,因此我得到了一个无效的html" target="_blank">内存访问错误。

现在,在我的客户机应用程序中,我使用JavaFX创建一个窗口,我的DLL可以在其中绘制,所以我必须获得JavaFX窗口的HWND。然后我要做的是将JNA的HWND对象的本机值发送到服务器,然后服务器使用该长本机值重新创建HWND对象。那管用。但是很明显,指针和其他类似的JNA对象没有。我认为这些指针对象和HWND对象(以及WinDef类中的其他对象)之间的区别在于HWND实际上是一个本机值,因为它来自Windows本身,否则它作为本机窗口句柄将非常无用。但是我认为JNA指针只存在于当前运行的JRE中。因此,将该指针值转移到另一个JRE(我的客户机运行的地方)是行不通的。我真的不能百分之百确定这些。

我只是一个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);
}

共有1个答案

厍兴腾
2023-03-14

指针的值是进程地址空间中的地址。在具有虚拟内存子系统的OS上(包括您将遇到的所有通用OSs,特别是Windows),这样的地址本质上是进程特有的。一个进程不能访问另一个进程的内存,无论是通过指针还是其他方式。这种记忆保护是一种有意的、高度可取的特性。

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

 类似资料:
  • 问题内容: 我确信你们中有人注意到,如果您有Acrobat Reader(或其他PDF阅读器),并在Firefox中打开一个PDF,您会看到它嵌入在您的标签中。有什么方法可以将应用程序嵌入JFrame中? 问题答案: 这是一个相当棘手的问题。通常,诸如Adobe Reader之类的本机应用程序不提供可以嵌入到swing应用程序中的组件。但是在Windows中,有COM / OLE方法可以将应用程序

  • 寻找更新的解决方案,运行最新的离子1.1.0版本,使用科尔多瓦5. x。尝试能够在chrome中浏览一个网站,并使用网络意图将该网址发送到我的ionicAndroid应用程序。我的应用程序编译和运行,但是当我试图使用共享功能从chrome(或任何其他应用程序),并选择我的应用程序共享,我的应用程序崩溃。 我第一次尝试使用插件: 离子插件添加https://github.com/Initsogar/

  • 问题内容: 我有一个GUI应用程序,需要在后台静默运行并继续收集信息。它首先需要显示UI以输入凭据,然后偶尔显示错误。 我了解我无法将GUI应用程序作为服务运行,因此我想创建服务只是为了启动GUI应用程序。因此,第一个程序作为服务运行,它仅启动GUI应用程序,然后继续监听来自GUI应用程序的任何信息。以下是启动GUI应用程序的第一个应用程序的代码。 当我运行此程序时,将启动GUI应用程序,但在5-

  • 我正在开发两个应用程序。让第一个应用程序是APP1,第二个应用程序为APP2。现在在APP1中,我不提供任何用户权限,如INTERNET权限,但它将发送任何http url,如http://www.google.com我的第二个APP2将包含INTERNET等用户权限。Http请求将从APP1发送到APP2,APP2将响应该请求,然后将结果发送回APP1。最后APP1包含一个Web视图以显示结果。

  • 我使用带有单个文件组件的网页包。 我的菜单标题中有一个Vue实例,用于显示购物车下拉列表: 我在同一页面中有另一个Vue实例(产品目录): 我想$emit一个事件从一个实例到另一个实例:当目录更改时,我想调用ShoppingCart中的函数。 我测试eventHub: 所以我在每个实例上导入事件: 目录中: 在购物车: 但这行不通。仅当$on和$emit位于Vue的同一实例中时,它才起作用。 我认

  • 我在google play商店里有两个应用程序。有可能在第一个描述中创建一个从一个到另一个的http链接吗?

  • Google在这里有一个很好的页面展示了如何这样做:https://developer.android.com/distribute/tools/promote/linking.html 基本上,使用这段代码,它将打开Play Store到新apps页面: 我错过了什么?我肯定它非常简单,也许我需要进口的东西。 解决方案:导入Uri类是一个问题。我仍然不确定新的热键是什么来导入它。Apple-Sh

  • 问题内容: 我想从Java代码运行另一个应用程序。 进程已启动,但在后台运行。如何使其在前台运行? 问题答案: 您应该告诉cmd.exe您希望它在新窗口中打开: