1

バイト ストリームを格納するために C API 実装で通常使用されるデータ型は何ですか? この型を jbyteArray に変換するにはどうすればよいですか?

4

4 に答える 4

1

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);
于 2010-01-20T13:48:01.490 に答える
1

それは (const) unsigned char * であり、バイト自体を保持するメモリのブロックを表し、バイト数を示す size_t と結合されます。

このスレッドは、適切な Java 型 (NewByteArray() が関数) を作成する方法について説明しているようです。

于 2009-01-23T08:24:02.157 に答える
0

あなたの質問はあまり明確ではありません。

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;                                                                                                        
    }                                                                                                                       
于 2009-01-24T06:56:54.207 に答える
0

それらを変換する必要はありません。タイプ 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 関数を呼び出す前に、バイト配列の長さが初期化されていることを確認してください。

于 2009-01-26T22:59:15.267 に答える