shm_open函数的正确Java映射是什么?

时间:2019-05-17 01:43:04

标签: shared-memory jna glibc

我正在尝试编写一些访问glibc的JNA代码,特别是在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 个答案:

答案 0 :(得分:1)

好吧,我在写问题时就发现了问题。

getuid()中定义了libc和朋友,在shm_open中定义了librt和朋友。我确实应该意识到,因为shm_open的联机帮助页明确声明“与-lrt链接”,表明它位于“ rt”库中。

简而言之:我需要一个与LibC一起的LibRT新接口,并以rt的名称加载。