Сопоставить структуру C ++ со структурой Java - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь вызвать функцию C ++, присутствующую в файле dll, функция C ++ принимает объект структуры в качестве параметра, и функция будет присваивать ему значения.Я использую это через нативные вызовы Java, и моя программа ниже,

public class WTS_CLIENT_ADDRESS extends Structure {
    public static class ByReference extends WTS_CLIENT_ADDRESS implements Structure.ByReference {

    }
public int AddressFamily;

public byte[] Address = new byte[20];

public WTS_CLIENT_ADDRESS() {
}

public WTS_CLIENT_ADDRESS(Pointer p) {
    super(p);
}

public byte[] getByteArray() {
    return Address;
}

@Override
protected List getFieldOrder() {
    return Arrays.asList("AddressFamily", "Address");
}
} 

Я получаю значения для AddressFamily правильно, но не для Address.похоже, что-то идет не так в структуре данных между байтовым массивом в c ++ и определенным байтовым массивом структуры java.Любая помощь?

Структура C ++ для него,

typedef struct _WTS_CLIENT_ADDRESS {
  DWORD AddressFamily;
  BYTE  Address[20];
} WTS_CLIENT_ADDRESS, *PWTS_CLIENT_ADDRESS;

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Что если вы передадите один байт в java?Есть две возможные проблемы: Массив и Тип или, возможно, оба из них.если один байт можно без проблем передать в Java, попробуйте использовать BYTE * Address вместо BYTE Address [] .Если это не помогает, попробуйте передать массив символов вместо байта char Address [] или char * Address .Дайте мне знать, если это решено.

0 голосов
/ 28 сентября 2018

В C ++ массивы статической длины, объявленные в структуре, встроены в структуру.Таким образом, ваш код на C ++ по структуре примерно эквивалентен:

typedef struct _WTS_CLIENT_ADDRESS {
  DWORD AddressFamily;
  BYTE Address1;
  BYTE Address2;
  // ...
  BYTE Address20;
} WTS_CLIENT_ADDRESS;

. Насколько мне известно, единственный способ, которым вы сможете отобразить Address в Java, так как нет лучшегоотображение из массивов Java в поля массива C ++.Обратите внимание, что это отличается от параметров массива C ++ в функциях, которые в основном являются указателями и поэтому работают правильно.

...