2013-08-12 2 views
1

Я новичок в java, поэтому, пожалуйста, со мной.Java jbytearray access in c (JNI)

У меня есть набор классов java, которые мне нужны для выполнения моей работы, в C/C++.

И, поскольку я довольно новичок в java, я делаю это шаг за шагом. Я получил возможность вызывать java со строкой, int double и т. Д., Но конечные результаты получат байт-массив назад (pdf-документ), поэтому я попытался отправить обратно простой массив из двух элементов.

Вот ява:

public class ReturnData 
{ 
    int returnValue; 
    String Log; 
    Byte[] data = new Byte[2]; 

    public ReturnData(int nRetVal, String szLog) 
    { 
     this.data[0] = 100; 
     this.data[1] = 12; 
     this.returnValue = nRetVal; 
     this.Log = szLog; 
    } 
} 

и вот код C++

jbyteArray jbyteData = (jbyteArray)jniEnvironment->GetObjectField(jobjRetData, 
    jniEnvironment->GetFieldID(clsReturn, "data", "Ljava/lang/ByteArray;")); 

И теперь в любое время я получить доступ к (инициализация JNI удален Это работает для простых типов, так ...). jbyteData элемент, такой как:

jsize len = jniEnvironment->GetArrayLength(jbyteData); 

я получаю исключение

System.AccessViolationException was unhandled 
Message: Attempted to read or write protected memory. This is often an indication that other 
memory is corrupt. 

Любая помощь будет оценена по достоинству.

ответ

2

Попробуйте изменить поле Byte[] data = new Byte[2]; к byte[] data = new byte[2];

Затем в JNI использования метода GetFieldID(clsReturn, "data", "[B"));

Edit: чтобы иметь возможность получить внутреннюю подпись каждого типа ([B для byte[] в вашем случае), вы можете объявить тыс поле, которое вы хотите присвоить классу (назовем его Test), скомпилируем его, а затем запустите javap -s Test. Он производит выход, как показано ниже:

Compiled from "SimpleMain.java" 
public class SimpleMain extends java.lang.Object{ 
public byte[] data; 
    Signature: [B   // <-- signature shows the internal type 
public SimpleMain(); 
    Signature:()V 
public static void main(java.lang.String[]); 
    Signature: ([Ljava/lang/String;)V 
} 
+0

Просто любопытно, где эти строки данных заданы. Я смотрел и смотрел и не мог найти авторитетного источника, поэтому мне приходилось делать записи в блогах и вопросы веб-сайта. – saunderl

+1

@saunderl Я добавил пример выполнения javap для ответа на полученный результат. Проверьте это –

1

Для FieldID, я думаю, вы хотите использовать "[B" вместо "Ljava/lang/ByteArray;", что на самом деле не класс.

Edit: так как вы используете Byte класс, который я пропустил в своем первоначальном ответе, используйте "[Ljava/lang/Byte;" вместо

+0

+1 для показа, как использовать байт. Мне действительно нужно было переключиться на байт (и вы тоже это ответили). – saunderl

Смежные вопросы