Если вы можете получить указатель на ячейку памяти, вы можете использовать методы Pointer
JNA для доступа к памяти. В качестве альтернативы вы можете создать 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.
EDIT
адресация конкретный вопрос о доступе к блок Окнах Named Shared Memory, вы должны понять, как получить к нему доступ через W32 API, а затем получить доступ к этим API, через ЮНА (или JNI, если вы предпочитаете).
С MS Docs:
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;
}
Это простой вопрос, чтобы сопоставить эти функции в ЮНА для использования в 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);
}
Обратите внимание, что ЮНА-х Kernel32
(в platform.jar
) уже включает в себя отображение для MapViewOfFile
, который возвращает Pointer
. Используя это возвращаемое значение, вы можете читать и записывать в разделяемую память на контент вашего сердца.
Возможно, вы совершенно правы и должны руководствоваться решением на основе JNI, реализованным на каком-то низкоуровневом языке (C?). –
Использование файла с отображением памяти - единственный способ сделать это на Java без дополнительного собственного кода. Однако, пока вы не вызываете синхронизацию широко, нет никакой разницы между «реальным» временным файлом и любыми другими способами создания разделяемой памяти. – Holger