Информация об изменениях

Сообщение GraalVM + native-image + posix + struct/union от 10.02.2021 9:39

Изменено 10.02.2021 9:42 Infernal

GraalVM + native-image + posix + struct/union
Всем привет. Не сильно надеюсь, что будет ответ, но вдруг

Играюсь с GraalVM и прямому доступу к линуксу.
С вызовом функций с простыми типами, как <a href="https://man7.org/linux/man-pages/man2/mmap.2.html" _target="_blank">mmap</a>, <a href="https://man7.org/linux/man-pages/man3/strerror.3.html" _target="_blank"> strerror</a>, ну и всяким прочим open/close/write/read проблем добраться и использовать нет.

Проблемы приши после попыток дотянуться до <a href="https://man7.org/linux/man-pages/man2/ioctl.2.html" target="_blank">ioctl</a>, а именно когда пришлось передавать стуктуры и указатели на структуру.

Скупая документация на GraalVM фактически <a href="https://github.com/oracle/graal/blob/master/substratevm/src/com.oracle.svm.tutorial/src/com/oracle/svm/tutorial/CInterfaceTutorial.java" target="_blank"> сводится к одному примеру</a>, который не особо помог с ответом.

А нужно протянуть в java что-то примерно такое:
typedef union my_union
{
  uint8_t  bb;
  uint16_t ww;
  uint8_t  arr[32]; // <-- Проблема раз, как заалоцировать
} my_union;

typedef struct my_struct
{
  char cc;
  int size;
  union my_union *data ; // <-- Проблема как создать и присобачить указатель на union тут
} i2c_smbus_ioctl_data;
my_struct


В Graal это привращается во что-то такое (оно даже компиляется и запускается):
@CStruct("my_union")
    public interface my_union extends PointerBase {
        @CField("bb")
        byte getBb();

        @CField("bb")
        void setBb(byte b);

        @CField("ww")
        short getWw();

        @CField("ww")
        void setWw(short word);

        @CFieldAddress("arr")
        Pointer getBlock(); // Какой тут тип должен быть?
    }

@CStruct("my_struct")
    public interface my_struct extends Pointer {
        @CField("сс")
        byte getСс();

        @CField("сс")
        void setСс(byte rw);
   

        @CField("size")
        int getSize();

        @CField("size")
        void setSize(int size);


        @CFieldAddress("data")
        CIntPointer getData(); // Какой тут тип должен быть? И как установить указатель на my_union
    }

При передаче в таком виде, оно падает с ошибкой ioctl failed: -1

Соответственно вопросы:
1. Как правильно объявить структуры в GraalVM
2. Как правильно инициализировать и установить указатели.

Либо хотя бы как отдэбажить что native-image генерит(оно в момент трет исходики нативные) и что в ioctl пришло. Заранее благодарен за ответы.
GraalVM + native-image + posix + struct/union
Всем привет. Не сильно надеюсь, что будет ответ, но вдруг

Играюсь с GraalVM и прямому доступу к линуксу.
С вызовом функций с простыми типами, как <a href="https://man7.org/linux/man-pages/man2/mmap.2.html" _target="_blank">mmap</a>, <a href="https://man7.org/linux/man-pages/man3/strerror.3.html" _target="_blank"> strerror</a>, ну и всяким прочим open/close/write/read проблем добраться и использовать нет.

Проблемы приши после попыток дотянуться до <a href="https://man7.org/linux/man-pages/man2/ioctl.2.html" target="_blank">ioctl</a>, а именно когда пришлось передавать стуктуры и указатели на структуру.

Скупая документация на GraalVM фактически <a href="https://github.com/oracle/graal/blob/master/substratevm/src/com.oracle.svm.tutorial/src/com/oracle/svm/tutorial/CInterfaceTutorial.java" target="_blank"> сводится к одному примеру</a>, который не особо помог с ответом.

А нужно протянуть в java что-то примерно такое:
typedef union my_union
{
  uint8_t  bb;
  uint16_t ww;
  uint8_t  arr[32]; // <-- Проблема раз, как заалоцировать
} my_union;

typedef struct my_struct
{
  char cc;
  int size;
  union my_union *data ; // <-- Проблема как создать и присобачить указатель на union тут
} my_struct;


В Graal это привращается во что-то такое (оно даже компиляется и запускается):
@CStruct("my_union")
    public interface my_union extends PointerBase {
        @CField("bb")
        byte getBb();

        @CField("bb")
        void setBb(byte b);

        @CField("ww")
        short getWw();

        @CField("ww")
        void setWw(short word);

        @CFieldAddress("arr")
        Pointer getBlock(); // Какой тут тип должен быть?
    }

@CStruct("my_struct")
    public interface my_struct extends Pointer {
        @CField("сс")
        byte getСс();

        @CField("сс")
        void setСс(byte rw);
   

        @CField("size")
        int getSize();

        @CField("size")
        void setSize(int size);


        @CFieldAddress("data")
        CIntPointer getData(); // Какой тут тип должен быть? И как установить указатель на my_union
    }

При передаче в таком виде, оно падает с ошибкой ioctl failed: -1

Соответственно вопросы:
1. Как правильно объявить структуры в GraalVM
2. Как правильно инициализировать и установить указатели.

Либо хотя бы как отдэбажить что native-image генерит(оно в момент трет исходики нативные) и что в ioctl пришло. Заранее благодарен за ответы.