- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个客户端和一个服务器应用程序。客户端向服务器发送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/
我正在使用 JNA 加载 native 库: MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary.so", MyLibrary
任何人都可以为我提供一个 JNA 鼠标钩子(Hook)的工作示例,它能够在我的 Java Swing 应用程序之外跟踪鼠标移动/单击吗? 提前致谢 最佳答案 是的,这里是代码... public cl
我在哪里可以获得支持 ARM64 的 JNA 库? com.sun.jna_4.jar 包含适用于 ARM 的 native libjnidispatch.so 库,但不包含适用于 ARM64 的库。
我正在尝试使用 JNA,因为我想使用一个用 c++ 编写的 .dll,而我的其余代码是用 Java 编写的。但是,如果我尝试导入 JNA 类 Eclipse 声称“com.sun.jna.Librar
我使用以下代码从java程序控制Windows服务 public class PostgresService2 { public static void main(String[] args)
我有一个用于 C 函数 mpv_set_option_string 的 JNA Java 接口(interface),定义为: public interface MPV extends StdCall
我正在查看中央 Maven 存储库,并看到一个 net.java.dev.jna 和一个用于 JNA 的 com.sun.jna groupId。 JNA 的 github,使用 com.sun.jn
我已经开始构建一个 java 服务,它结合了 JNA 来加载 native C/C++ 库,我想在 Raspberry PI aka arm 平台上运行 java 服务。我已经成功地建立了一个稳定的服
我要离开 this如何传递 com.sun.jna.Structure 的示例包含 com.sun.jna.StringArray使用 JNA 从 Java 转换为 native C 代码,并且无法在
我正在准备 spring-boot 应用程序。然后我得到以下错误: JNA not found. native methods will be disabled. java.lang.ClassNot
遇到令人抓狂的阻塞错误: Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.luke
我已经下载并复制 Jna.jar 和 Platform.jar 到/usr/cassandra/apache-cassandra-1.0.7/lib 文件夹,但在 Cassandra 启动时仍然看到以
我有一个像这样的 JNA 库 stub : public interface FREngine extends Library { NativeLibrary JNA_NATIVE_LIB =
我想使用 JNAerator 为 JNA 生成一些 C++ API 函数的 Java 包装器。问题是我无法在工作时使用 JNAerator Studio 或从我的 PC 访问 Github。我只有 G
在 JNA 中,如何从 Xlib 映射联合结构,如以下 XEvent typedef union _XEvent { int type; /* must not be changed *
我正在尝试使用 JNA 从 java 运行 ShellExecute 函数。我在非 unicode 文件夹上运行 ShellExecuteA 没有任何问题 import com.sun.jna.*;
在弄清楚如何将 ClientToScreen winapi 函数与 JNA 结合使用时遇到问题。 我仍然得到窗口句柄坐标的 0, 0 输出。我引用了这个,但我确信我做得不对 https://msdn.
我有两个局部变量: Pointer output; int output_len; /* or better `size_t output_len;` */ 我需要将这些变量的指针传递到 JNA 函数
我有一个openvr binding有一段时间以来有一个小问题 基本上,每当我释放某些几何 3D 模型(基站或 Controller )的内存时,我都会时不时地收到错误: "java.lang.Err
我是 JNA 新手,我想将 DsGetDcName 方法转换为 JNA。 DWORD DsGetDcName( __in LPCTSTR ComputerName, __in LPCT
我是一名优秀的程序员,十分优秀!