バイト ストリームを格納するために C API 実装で通常使用されるデータ型は何ですか? この型を jbyteArray に変換するにはどうすればよいですか?
4 に答える
NewByteArray() を使用して直接返す Java_ReadFile_loadFile の例を参照してください。
http://dev.cs.ovgu.de/java/Books/JDCBook/jnistring.html
JNIEXPORT jbyteArray JNICALL Java_ReadFile_loadFile
(JNIEnv * env, jobject jobj, jstring name) {
caddr_t m;
jbyteArray jb;
struct stat finfo;
jboolean iscopy;
const jchar *mfile = (*env)->GetStringChars(env,
name, &iscopy);
//...
(*env)->ReleaseStringChars(env, name, mfile);
それは (const) unsigned char * であり、バイト自体を保持するメモリのブロックを表し、バイト数を示す size_t と結合されます。
このスレッドは、適切な Java 型 (NewByteArray() が関数) を作成する方法について説明しているようです。
あなたの質問はあまり明確ではありません。
C に文字を表すバイトがあると仮定すると、そのバイトを Java に取得し、そこで Java のバイト変換を使用してテキストに変換するのが最善の方法です。
JNI では、JNI を使用して Java 配列をインスタンス化するか、参照をパラメーターとして渡すことによって、Java 配列を具体化する必要があります (そのためには、JNI コードでポインターを「具体化」する必要があります)。
私は以前にこの後者のことを行ったことがありますので、参考までにコードを示します。この JNI 呼び出しでは、AS/400 C API を使用してデータベース レコードを読み取り、そのバイトを Java に返しました。次に、Java コードはレコード形式情報を使用してフィールドを文字列に抽出しました。これがお役に立てば幸いです:
JNIEXPORT jboolean JNICALL Java_com_xxx_DB2File_jniRead(JNIEnv *jep, jobject thsObj,
jlong handle, jint readOp, jbyteArray jvaDta, jint jvaDtaMax, jint flags) {
OBJDTA *odp;
jbyte *jniDta;
_RIOFB_T *fbp;
thsObj=thsObj;
if((odp=getDataspace(handle))==NULL) {
throwEscape(jep,90003,"Invalid handle for dataspace in jniRead()");
return JNI_FALSE;
}
jniDta=(*jep)->GetByteArrayElements(jep,jvaDta,0);
// read database record here
if(fbp->num_bytes<=0) {
(*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */
return JNI_FALSE;
}
if(fbp->num_bytes!=odp->rcdLen) {
byte errtxt[201];
asd_errtxt(errno,errtxt,sizeof(errtxt));
(*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */
throwEscape(jep,90204,"Native function jniRead failed. Got %i, expected %i (%s)",fbp->num_bytes,odp->rcdLen,
errtxt);
return JNI_FALSE;
}
(*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,0); /* copy changed array back to java */
return JNI_TRUE;
}
それらを変換する必要はありません。タイプ jbyteArray と char* は互換性があります。
Java 宣言:
private static native int doSomething(bate[] string, int length);
C デラレーション:
JNIEXPORT jint JNICALL Java_package_class_doSomething(JNIEnv *env, jclass jc, jbyteArray string, jint length) {
int i;
for (i = 0; i < length; i++) {
// read string[i]
}
}
同じ方法で値を Java に戻すことができます。ただし、C 関数を呼び出す前に、バイト配列の長さが初期化されていることを確認してください。