Сопоставление JNA Java с собственной C общей библиотекой - PullRequest
0 голосов
/ 07 мая 2020

Попытка передать следующий код из Java в общую библиотеку C .so. Я очень новичок в JNA, если бы кто-то указал мне правильное направление, я был бы очень благодарен.

Я получаю следующую ошибку: java .lang.Error: Structure.getFieldOrder () на class com .dataTypes.TCIMUEvent не предоставляет достаточное количество имен [0] ([]) для соответствия объявленным полям [11] ([Accel, AccelValid, gyro, gyroValid, mag, magValid, pressure, pressureValid, temperature, temperatureValid, time])

Два соответствующих объекта / структуры:

public class Motion extends Structure {

    public TCIMUEvent tcimuEvent;
    public int Status;
    public double userHeadingDeg;
    public float rotationMode;

    public Motion() {
    }

    public TCIMUEvent getTcimuEvent() {
        return tcimuEvent;
    }

    public Motion(TCIMUEvent tcimuEvent, int status, double userHeadingDeg, float rotationMode) {
        this.tcimuEvent = tcimuEvent;
        Status = status;
        this.userHeadingDeg = userHeadingDeg;
        this.rotationMode = rotationMode;
    }
public class TCIMUEvent extends Structure {

    public double time;
    public float[] accel;
    public boolean accelValid;
    public float[] mag;
    public boolean magValid;
    public float[] gyro;
    public boolean gyroValid;
    public float pressure;
    public boolean pressureValid;
    public float temperature;
    public boolean temperatureValid;

    public TCIMUEvent(double time, float[] accel, boolean accelValid, float[] mag, boolean magValid, float[] gyro, boolean gyroValid, float pressure, boolean pressureValid, float temperature, boolean temperatureValid) {
        this.time = time;
        this.accel = accel;
        this.accelValid = accelValid;
        this.mag = mag;
        this.magValid = magValid;
        this.gyro = gyro;
        this.gyroValid = gyroValid;
        this.pressure = pressure;
        this.pressureValid = pressureValid;
        this.temperature = temperature;
        this.temperatureValid = temperatureValid;
    }

Пример структуры C:


typedef struct {
  double time;
  double accel[3];
  bool accelValid;
  double mag[3];
  bool magValid;
  double gyro[3];
  bool gyroValid;
  double pressure;
  bool pressureValid;
  double temperature;
  bool temperatureValid;
} T_imuDataSample_t;

Файл C, обрабатывающий данные:

void HandleImuEvent(T_imuDataSample_t *imuDataSample, int *status,
  double *userHeadingDeg, StrapdownStreaming_RotationMode *currentRotateMode)
{

Здесь данные передаются от Java до C:

HandleImuEvent(motion.getTcimuEvent(), motion.getStatus(), motions.getUserHeadingDeg(), motions.getRotationMode());

Полная трассировка ошибки:

    java.lang.Error: Structure.getFieldOrder() on class com.dataTypes.TCIMUEvent does not provide enough names [0] ([]) to match declared fields [11] ([accel, accelValid, gyro, gyroValid, mag, magValid, pressure, pressureValid, temperature, temperatureValid, time])
        at com.sun.jna.Structure.getFields(Structure.java:1077)
        at com.sun.jna.Structure.deriveLayout(Structure.java:1232)
        at com.sun.jna.Structure.calculateSize(Structure.java:1159)
        at com.sun.jna.Structure.allocateMemory(Structure.java:401)
        at com.sun.jna.Structure.ensureAllocated(Structure.java:377)
        at com.sun.jna.Structure.ensureAllocated(Structure.java:367)
        at com.sun.jna.Structure.size(Structure.java:434)
        at com.sun.jna.Structure.size(Structure.java:1137)
        at com.sun.jna.Native.getNativeSize(Native.java:1354)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2253)
        at com.sun.jna.Structure.getNativeSize(Structure.java:2243)
        at com.sun.jna.Structure.validateField(Structure.java:1209)
        at com.sun.jna.Structure.validateFields(Structure.java:1222)
        at com.sun.jna.Structure.<init>(Structure.java:200)
        at com.sun.jna.Structure.<init>(Structure.java:193)
        at com.sun.jna.Structure.<init>(Structure.java:180)
        at com.sun.jna.Structure.<init>(Structure.java:172)
        at com.dataTypes.Motion.<init>(Motion.java:17)

I есть ощущение, что я немного наивен в отношении того, что делает JNA, поэтому проблема будет в моем понимании того, как мне нужно передавать данные, поэтому общие советы по этой конкретной реализации c, безусловно, помогут мне понять, какие шаги требуются для используйте JNA. Я просмотрел много учебных пособий и в настоящее время просматриваю другие ответы здесь. Если вам нужна дополнительная информация или контекст, пожалуйста, позвоните мне.

1 Ответ

0 голосов
/ 07 мая 2020

Как говорится в ошибке, вам не хватает метода GetFieldOrder.

Из документации :

Вы должны определить getFieldOrder () для возврата Список имен полей (строк), указывающих правильный порядок полей. При работе с несколькими уровнями подклассов структуры вы должны добавить в список, предоставляемый суперклассом getFieldOrder (), поля, определенные в текущем классе.

Вы также можете использовать аннотацию @Structure.FieldOrder , чтобы указать порядок полей вместо определения метода.

...