J'ai déjà posté une question à ce sujet, mais je n'ai pas encore de compte à ce moment-là. J'ai eu une réponse mais j'étais encore confus et je ne peux pas continuer sur ce fil.Récupération d'un tableau d'octets de longueur inconnue à partir du magasin Java
Je répète la question avec un lien vers la conversation précédente.
Returning char array from java to string - JNI
Les données que je suis le stockage en Java est sérialisé. Je fais un appel de fonction java en utilisant le morceau de code suivant.
Le code suivant suppose que char de C est compatible avec octet de Java, car char de Java est de 2 octets alors que char de C est de 1 octet. Le jbyte est aussi un 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);
}
Une fois que je l'ai enregistré les données, j'utiliser une autre fonction pour récupérer les données du magasin. À ce moment-là, je ne connais pas la taille des données que je vais récupérer. Mon API est en C et le magasin est en Java. J'utiliserai mes fonctions C pour interagir avec Java. Et il peut également y avoir plusieurs threads qui récupèrent des données du magasin Java en même temps.
Je fais des appels de C vers Java et mon contrôle devrait retourner au programme C après avoir récupéré des données. Je suis un peu confus sur la façon dont le code va fonctionner. Comment vais-je obtenir un pointeur vers un tableau (récupéré à partir de Java) et ensuite le récupérer en utilisant GetByteArrayElements. Rappelez-vous que je ne connais pas la taille des données que je vais récupérer avant ma main et que je ne peux donc pas créer un tableau d'octets en utilisant la fonction NewByteArray et plus tard le remplir avec des données en code java.
Merci J'ai rencontré exactement le même problème et ce code a été utile. Dans VisualStudio j'ai dû inclure quelques moulages pour le compiler, j'ai dû convertir la valeur de retour de CallStaticObjectMethod avec (jbyteArray), et j'ai dû convertir la valeur de retour de GetByteArrayElements avec (char *) –
Merci pour ça! 4 ans plus tard, je suis tombé sur le même problème dans les méthodes env-> ne travaillant pas à lire dans un champ tableau d'octets. Cette solution a fonctionné :) – blkhatpersian