Как получить новый указатель в Java? - PullRequest
8 голосов
/ 28 ноября 2010

Как я могу вызвать метод с сигнатурой этого метода в C из JNA?

int open_device(context *ctx, device **dev, int index);

Последние две строки метода C выглядят так:

*dev = pdev;
return 0;

Этотолько использование dev в этом методе.Это означает, что я должен передать указатель на пустой указатель на метод, верно?Затем метод заполняет пустой указатель адресом объекта device, и я могу передать указатель на устройство другим методам.

Мой вопрос: это правильный способ сделать это?Если это так, как мне выделить новый указатель из Java?


Основываясь на принятом ответе, я сделал это:

Memory p = new Memory(Pointer.SIZE);
Memory p2 = new Memory(Pointer.SIZE);
p.setPointer(0, p2);
nativeLib.open_device(ctx, p, index);
return p2;

Ответы [ 3 ]

9 голосов
/ 28 ноября 2010

Похоже, что класс JNA Pointer имеет setPointer и getPointer методы для множественной косвенности, а класс Memory фактически "выделяет" родные предметы. Так что вы должны быть в состоянии сделать что-то вроде: (я просто догадываюсь из документации JNA, я не проверял это)

Pointer pDev = new Memory(Pointer.SIZE); // allocate space to hold a pointer value
// pass pDev to open_device
Pointer dev = pDev.getPointer(0);        // retrieve pointer stored at pDev
0 голосов
/ 22 ноября 2015

Еще лучше ответ. Вы можете выделить (malloc и т. Д.) В зависимости от длины строки Java. Пример ниже - это модульное тестирование из проекта JNA.

public void testGetSetStringWithDefaultEncoding() throws Exception {
    final String ENCODING = Native.DEFAULT_ENCODING;
    String VALUE = getName();
    int size = VALUE.getBytes(ENCODING).length+1;
    Memory m = new Memory(size);
    m.setString(0, VALUE);
    assertEquals("Wrong decoded value", VALUE, m.getString(0));
}
0 голосов
/ 28 ноября 2010

В Java нет указателей, есть только ссылки.

Нельзя переназначить ссылку, когда вы передаете их методам, потому что вы передаете их по значению.Все передается по значению в Java.

Вы можете переписать этот метод, чтобы создать новый экземпляр устройства и вернуть его вместо int.

...