Получение байтового массива неизвестной длины из хранилища Java

Я уже опубликовал вопрос по этому поводу, но в то время я неУ меня есть аккаунт. Я получил ответ, но я все еще был в замешательстве, и я не могу продолжать эту тему.

Я снова публикую вопрос вместе со ссылкой на предыдущий разговор.

Возвращая массив символов из Java в строку - JNI

Данные, которые я храню в Java, сериализуются. Я делаю вызов функции Java, используя следующий кусок кода.

В следующем коде предполагается, что символ C совместим с байтом Java, потому что символ Java имеет 2 байта, тогда как символ C имеет 1 байт. Jbyte также является подписанным символом * {}

    //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);

После сохранения данных я использую другую функцию для извлечения данных из хранилища. В то время я не знаю, какой объем данных я собираюсь получить. Мой API в C, а магазин в Java. Я буду использовать свои функции C для взаимодействия с Java. А также может быть несколько потоков, извлекающих данные из хранилища Java одновременно.

Я делаю вызовы из C в Java, и мой контроль должен вернуться в программу C после получения данных. Я немного запутался в том, как будет работать код. Как я получу указатель на массив (извлеченный из Java), а затем получить его с помощью GetByteArrayElements. Помните, я не знаю размер данных, которые я собираюсь получить заранее, и поэтому не могу создать байтовый массив с помощью функции NewByteArray, а затем заполнить его данными в коде Java.

Ответы на вопрос(2)

Ваш ответ на вопрос