В моем коде Java у меня есть эта структура:
Код: Выделить всё
public class DataStruct {
public boolean myBoolean;
public String myString;
public byte[] myArray;
/*some setter and getter methods*/
}
Код: Выделить всё
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;
Код: Выделить всё
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
Я думал о преобразовании этого массива байтов в строку и передаче ему структуры Java как есть, но не совсем уверен, что это лучший способ.