Ich habe bereits eine Frage dazu geschrieben, aber zu diesem Zeitpunkt habe ich nicht das Konto. Ich bekam eine Antwort, aber ich war immer noch verwirrt und ich kann diesen Thread nicht fortsetzen.Abrufen von Byte-Array unbekannter Länge aus Java-Speicher
Ich bin re die Frage wieder zusammen mit einem Link zum vorherigen Gespräch veröffentlichen.
Returning char array from java to string - JNI
Die Daten, die ich in Java bin Speicherung serialisiert. Ich mache einen Java-Funktionsaufruf mit folgendem Code.
Der folgende Code geht davon aus, dass char von C mit dem Byte von Java kompatibel ist, weil char von Java von 2 Bytes ist, während der C char von 1 Byte ist. Die jbyte ist auch ein signed char *
//value will be the serialized data
void store(char* key, char* value, int val_len)
{
//consider the jclass and methodid are already initialized
jstring j_key = (*env)->NewStringUTF(env, key);
jbyteArray j_value = (*env)->NewByteArray(env, val_len);
(*env)->SetByteArrayRegion(env, j_value, 0, val_len, (jbyte *)value);
//The store method on java side will save the value (as is) in memory
(*env)->CallStaticVoidMethod(j_class, store_method, key, value);
(*env)->ReleaseByteArrayElements(env, j_value, (jbyte *)value, JNI_ABORT);
(*env)->ReleaseStringUTFChars(env, j_key, key);
}
Nachdem ich die Daten gespeichert haben, verwende ich eine andere Funktion Daten aus dem Speicher abgerufen werden. Zu diesem Zeitpunkt weiß ich nicht, wie groß die Daten sind, die ich abrufen werde. Meine API ist in C und Store ist in Java. Ich werde meine C-Funktionen verwenden, um mit Java zu interagieren. Außerdem können mehrere Threads gleichzeitig Daten aus dem Java-Speicher abrufen.
Ich bilde Anrufe von C nach Java und meine Kontrolle soll nach Abrufen von Daten zu C-Programm zurückzukehren. Ich bin ein wenig verwirrt darüber, wie der Code funktioniert. Wie bekomme ich Zeiger auf Array (abgerufen von Java) und dann abrufen Sie mit GetByteArrayElements. Denken Sie daran, dass ich die Größe der Daten, die ich vorher abrufen werde, nicht kenne und daher kein Byte-Array mit der NewByteArray-Funktion erstellen und später mit Daten in Java-Code füllen kann.
Danke Ich habe genau das gleiche Problem und dieser Code war hilfreich. In Visual Studio musste ich einige Würfe enthalten, um es aber zu kompilieren, ich hatte den Rückgabewert von CallStaticObjectMethod mit (jbyteArray) zu werfen, und ich hatte den Rückgabewert von GetByteArrayElements mit (char *) zu werfen –
Vielen Dank dafür! 4 Jahre später stieß ich auf das gleiche Problem in den env-> Methoden, die nicht zum Lesen in einem Byte-Array-Feld arbeiten. Diese Lösung hat funktioniert :) – blkhatpersian