gpt4 book ai didi

java - 从java中的c++/c#程序读取共享内存

转载 作者:行者123 更新时间:2023-12-01 18:35:58 25 4
gpt4 key购买 nike

我如何读取共享内存部分,例如“全局\某物_某物”在java中由c#/c++程序创建并更新?我找到了一些教程,但它们要么使用“真实文件”,要么有其他一些附加内容。我知道我必须通过 jna 进行 native 调用,例如 Windows api 并使用类似 openFileMapping 函数之类的东西。

是否有我错过的教程或者有人可以给我一些示例代码?在 java 中使用 jna 或 jni 是实现此类操作的唯一方法吗?

最佳答案

如果可以获得指向内存位置的指针,可以使用JNA的Pointer访问内存的方法。或者,您可以创建 direct NIO Buffer ,这有助于 Java 和 native 之间共享内存。

这些方法中的任何一种对于共享内存都应该同样有效。

// Use JNA-allocated non-Java heap memory
Memory m = new Memory(size);
myNativeLib.useSharedMemory(m);
// Use JVM-allocated non-Java heap memory
Buffer b = ByteBuffer.allocateDirect(size);
myNativeLib.useSharedMemory(b);
// Use native-allocated memory
Pointer p = myNativeLib.getSharedPointer();

如果您想共享超过可用物理内存,那么最好使用 file-based mapping .

编辑

解决访问 Windows block Named Shared Memory 的具体问题,您需要了解如何通过 w32 API 访问它,然后通过 JNA(或 JNI,如果您愿意)访问这些 API。

来自 MS 文档:

   HANDLE hMapFile;
LPCTSTR pBuf;

hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object

if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}

pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);

if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());

CloseHandle(hMapFile);

return 1;
}

将这些函数映射到 JNA 以便在 Java 中使用是一件简单的事情:

import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.Native;

public interface MyKernel32 extends Kernel32 {
int FILE_MAP_ALL_ACCESS = // look it up
MyKernel32 INSTANCE = (MyKernel32)Native.loadLibrary(MyKernel32.class, W32APIOptions.DEFAULT_OPTIONS);
HANDLE OpenFileMapping(int dwDesiredAccess, boolean bInheritHandle, String lpName);
}

请注意 JNA 的 Kernel32 (在 platform.jar 中)已经包含 MapViewOfFile 的映射,它返回 Pointer 。使用该返回值,您可以随意读取和写入共享内存。

关于java - 从java中的c++/c#程序读取共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60043558/

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