Когда вы получаете сообщение об ошибке «Недопустимый доступ к памяти», вы должны начать смотреть, когда выделение собственной памяти выполнено. Обычно API документирует это (и говорит вам, как его освободить), а когда нет, вы знаете, что это ваша ответственность. В этом случае вы можете видеть в опубликованном вами коде C, распределение выполняется внутри метода тестирования:
PA current = (PA) malloc(sizeof(A));
и
PA next = (PA) malloc(sizeof(A));
Проблема в том, что сторона Java не знает об этом распределении, поэтому вам придется сделать это вручную.
Ваше отображение функции с использованием PointerByReference
выглядит нормально. Хотя вы можете использовать getInt(0)
при возврате, вам, вероятно, будет лучше на этом этапе просто создать экземпляр структуры A
из возвращенного указателя, как вы это сделали:
A a = new A(pointer.getValue());
Затем a.num
должен быть ваш ожидаемый 123321. Затем вы должны взять возвращенный указатель (на ссылку, выделенную в собственном коде) и использовать его для создания другой Java -сторонней структуры:
A b = new A(a.next);
(вы можете захотеть просто используйте Pointer
в структуре, чтобы упростить эту часть. Если вы используете ByReference
или A.ByReference
, тогда используйте getPointer()
в этой части.)
На этом этапе я считаю b.num
должен дать вам 456.