2012-06-01 5 views
1

Мне нужно передать массив и целое число из java-метода, который вызывается JNI.Возврат из java в JNI по ссылке

public static int foo(byte[] data) 
{ 
    byte[] buffer; 
    // Fill buffer with data 
    data = buffer; // <--- This doesn't work as the pointer is changed 
    return bufferSize; 
} 

В строке указано, что я понимаю, что указатель изменяется, но ссылка, которую я имею в JNI к data, который я прошел в не обновляется, так что я не получаю новые данные.

Как бы я мог возвращать дополнительные данные, хотя параметры?

+0

Вам необходимо передать объекты и использовать их сеттеры для изменения их значений. –

+1

Хорошо, как это работает, если бы я хотел вернуть целое число по параметру, заданному 'Integer', является неизменным? – DrYap

+0

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

ответ

0

Кредит K-Балло:

Массив байтов должен был быть в классе обертке.

class ByteArrayWrapper { 
    public ByteArrayWrapper() {} 
    public byte[] array; 
} 

В JNI Я создаю экземпляр этого класса и передаю его методу.

public static int foo(ByteArrayWrapper data) { 
    byte[] buffer; 
    // Fill buffer with data 
    data.array = buffer; 
    return bufferSize; 
} 

Экземпляр ByteArrayWrapper в JNI теперь содержит новый массив байтов, которые могут быть доступны с помощью jfieldID для этого свойства.