ARTICLE AD BOX
I'm trying to assign a byte[] field in a Java structure directly in C++ using the env->SetObjectField() method, but at this point I always get a crash.
In my Java code, I have this structure:
public class DataStruct { public boolean myBoolean; public String myString; public byte[] myArray; /*some setter and getter methods*/ }From the native side of my JNI code, I have this:
jclass arrayClass = env->FindClass("java/util/ArrayList"); jmethodID arrayMethodId = env->GetMethodID(arrayClass, "<init>", "()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, "<init>", "()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;As you can see, I'm trying to make an ArrayList<DataStruct> directly in C++ and return it to Java. Most of the C++ code works: it creates the DataStruct object, gets the IDs of the boolean, String and byte[] fields, sets the boolean and String fields, but at the moment it reaches the env->SetObjectField() method for the byte[] field, I get this error:
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 SetObjectFieldIf I don't try to assign this array field, the code works as expected.
As this documentation says in Figure 3-1, a jbyteArray (like jstring) is a jobject, so I used env->SetObjectField(), but it seems like a jbyteArray is not accepted here.
Am I missing something?
I was thinking of transforming this byte array into a String and passing it the Java struct as-is, but I'm not really sure if this is the best way.
EDIT:
This is my actual getSomeArrays(); function:
jbyteArray getJavaByteArray(JNIEnv* env, const uint8_t* payload, size_t len) { jbyteArray array = env->NewByteArray(static_cast<jsize>(len)); env->SetByteArrayRegion(array, 0, static_cast<jsize>(len), reinterpret_cast<const jbyte *>(payload)); return array; }