Как установить jbyteArray в структуру Java из собственного C JNIJAVA

Программисты JAVA общаются здесь
Anonymous
Как установить jbyteArray в структуру Java из собственного C JNI

Сообщение Anonymous »

Я пытаюсь установить jbyteArray в структуру Java непосредственно в C, используя метод env->SetObjectField(obj, fieldId, value);, но на этом этапе у меня всегда происходит сбой.
В моем коде Java у меня есть эта структура:

Код: Выделить всё

public class DataStruct {
public boolean myBoolean;
public String myString;
public byte[] myArray;

/*some setter and getter methods*/
}
Со стороны моего JNI-кода у меня есть это:

Код: Выделить всё

jclass arrayClass = env->FindClass("java/util/ArrayList");
jmethodID arrayMethodId = env->GetMethodID(arrayClass, "", "()V");
jobject objArr = env->NewObject(arrayClass, arrayMethodId);
jmethodID arrayMethodIdAdd = env->GetMethodID(arrayClass, "add", "(Ljava/lang/Object;)Z");

while (continueLoop) {
jclass objClass = env->FindClass("path/to/my/DataStruct");
jmethodID objMethodId = env->GetMethodID(objClass, "", "()V");
jobject dataObject = env->NewObject(objClass, objMethodId);

jfieldID myBooleanField = env->GetFieldID(objClass, "myBoolean", "Z");
jfieldID myStringField = env->GetFieldID(objClass, "myString", "Ljava/lang/String;");
jfieldID myArrayField = env->GetFieldID(objClass, "myArray", "[B");

jboolean bool = getSomeBoolean();
env->SetBooleanField(dataObject, myBooleanField, bool);

std::string str = getSomeString();
env->SetObjectField(dataObject, myStringField, env->NewStringUTF(str.c_str()));

jbyteArray arr = getSomeArrays();
env->SetObjectField(dataObject, myArrayField, arr);

env->CallBooleanMethod(objArr, arrayMethodIdAdd, dataObject);
}

return objArr;
Как видите, я пытаюсь создать ArrayList непосредственно на C и вернуть его в Java. Все работает: код C создает объект DataStruct, получает логические поля, String и byte[], устанавливает логические и строковые переменные, но в тот момент, когда код достигает функции env->SetObjectField(dataObject, myArrayField, arr);, я получаю такую ​​ошибку:

Код: Выделить всё

java_vm_ext.cc:594] JNI DETECTED ERROR IN APPLICATION: JNI ERROR (app bug): jobject is an invalid JNI transition frame reference or invalid reference: 0x7db6c32000 (use of invalid jobject)
java_vm_ext.cc:594]     in call to SetObjectField
Если я не попытаюсь установить этот массив, код будет работать как положено. Как сказано в документации на рис. 3-1, jbyteArray (например, jstring) является проектом задания, поэтому я использовал env->SetObjectField(), но похоже, что jbyteArray здесь не принимается. Я что-то упустил?
Я думал о преобразовании этого массива байтов в строку и передаче ему структуры Java как есть, но не совсем уверен, что это лучший способ.

Вернуться в «JAVA»