私はすでにそれに関する質問を掲載しましたが、その時点で私はそのアカウントを持っていません。私は返信を受けましたが、私はまだ混乱していて、そのスレッドでは続行できません。Javaストアから未知の長さのバイト配列を取得する
私は以前の会話へのリンクとともに質問を再度投稿しています。
Returning char array from java to string - JNI
私はJavaで保管していたデータは、シリアル化されます。次のコードを使用してJava関数呼び出しを行います。
次のコードは、Javaのcharが2バイトでCのcharが1バイトであるため、CのcharがJavaのbyteと互換性があると仮定しています。 jbyteも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);
}
Iは、データを保存した後、私はストアからデータを取得するために別の関数を使用します。その時点で私は取得しようとしているデータのサイズを知りません。私のAPIはC言語で、ストアはJavaで書かれています。 C関数を使ってJavaとやり取りします。また、Javaストアから同時にデータを取得する複数のスレッドが存在する可能性があります。
私はCからJavaへの呼び出しを行っています。データを取得した後、コントロールはCプログラムに戻ります。コードがどのように機能するか少し混乱しています。どのように配列(javaから取得)へのポインタを取得し、GetByteArrayElementsを使用してそれを取得するのですか?覚えておいてください私は手の前に取得するため、NewByteArray関数を使用してバイト配列を作成することはできませんし、後でJavaコードのデータでそれを埋めることができないデータのサイズを知っています。
ありがとう私は全く同じ問題を抱えており、このコードは役に立ちました。 VisualStudioでは、コンパイルするためにいくつかのキャストを含める必要がありました。(jbyteArray)を使用してCallStaticObjectMethodから戻り値をキャストしなければならず、GetByteArrayElementsの戻り値を(char *)でキャストしなければなりませんでした。 –
ありがとうございます! 4年後、同じ問題がenv->メソッドで発生し、バイト配列フィールドでの読み込みができなくなりました。この解決策は働いた:) – blkhatpersian