Проблемы с параметрами JNA: неверный доступ к памяти - PullRequest
0 голосов
/ 29 января 2019

Я хочу вызвать функцию "mytestFunction" в Java через JNA.Вот как я называю метод в C ++:

size_t input_length = 67U; 
uint8_t input[67U] = { 0x30, 0x41, 0x80, ....}; 
uint8_t *output_buffer = NULL; 
size_t output_length = 0; 
uint32_t errorCode = 0;
errorCode = mytestFunction(input, input_length, &output_buffer, &output_length);

Вот как я называю метод в Java:

IcbdpClient cbdpFuncs = (IcbdpClient) Native.load("myDLL.dll", IcbdpClient.class); 
int[] input = new int[]{0x30, 0x41, 0x80, ....};
SizeT input_length = new SizeT(input.length);
Pointer output_buffer = new Memory(1);
SizeT output_length = new SizeT(0);
err = cbdpFuncs.mytestFunction(input, input_length, output_buffer, output_length);

Я уже вызывал метод с одним байтом [] Paramter,Все работает.Но теперь, когда я делаю функцию cbdpFuncs.mytestFunction, я получаю «java.lang.Error: Неверный доступ к памяти».Я думаю, что обрабатывать параметры output_buffer и output_length false.Но я не знаю, каков правильный путь.

РЕДАКТИРОВАТЬ: в ICdpClient mytestFunction называется как:

 int mytestFunction (int[] input, SizeT input_length, Pointer output_buffer, SizeT output_length);

1 Ответ

0 голосов
/ 30 января 2019

Я нашел решение: Проблема была в том, что я объявил output_buffer и output_length false: это правильная форма:

PointerByReference output_buffer = new PointerByReference();
IntByReference output_length = new IntByReference();

Если вы хотите использовать указатель после этого, см. Здесь: https://github.com/java-native-access/jna/blob/master/www/ByRefArguments.md

...