Какое правильное отображение Java функции shm_open? - PullRequest
2 голосов
/ 17 мая 2019

Я пытаюсь написать код JNA, который обращается к glibc, в частности, функции, определенные в mmap.h.

Я попытался определить его точно так, как показано в man shm_open. Вызов функции getuid() непосредственно перед началом работы, но shm_open не возвращается.

Я вынужден использовать JNA 4.4.0 и JNA Platform 3.4.0.

interface LibC extends Library {
    LibC INSTANCE = Native.loadLibrary("c", LibC.class);

    int shm_open(String name, int oFlag, int mode);
}
// ...
int fileDescriptor = LibC.INSTANCE.shm_open("/some_memory.123", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
// ...

Я ожидаю, что будет возвращен дескриптор файла, но я получаю следующие исключения:

  • Когда я загружаю "libc.so.6": java.lang.UnsatisfiedLinkError: Error looking up function 'shm_open': /lib/x86_64-linux-gnu/libc.so.6: undefined symbol: shm_open
  • Когда я загружаю "c": java.lang.UnsatisfiedLinkError: Error looking up function 'shm_open': /usr/lib/jvm/java-8-openjdk-amd64/bin/java: undefined symbol: shm_open

1 Ответ

1 голос
/ 17 мая 2019

Ну, я выяснил проблему во время написания вопроса.

Хотя getuid() и друзья определены в libc, shm_open и друзья определены в librt.Я действительно должен был это понять, потому что на man-странице для shm_open явно указано «Link with -lrt», что указывает на то, что он находится в lib «rt».

Короче говоря: мне нужен новый интерфейс для LibRT вместе сLibC, загруженный с именем rt.

...