簡體   English   中英

從Java存儲中檢索未知長度的字節數組

[英]Retrieving byte array of unknown length from Java store

我已經發布了一個關於它的問題,但那時我還沒有賬號。 我得到了答復,但我仍然感到困惑,我不能繼續這個帖子。

我將再次發布問題以及之前對話的鏈接。

將char數組從java返回到字符串 - JNI

我用Java存儲的數據是序列化的。 我使用下面的代碼進行java函數調用。

下面的代碼假定C的char與Java的字節兼容,因為Java的char是2字節而C的char是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到Java,我的控件應在檢索數據后返回C程序。 我對代碼如何工作有點困惑。 我將如何獲取指向數組的指針(從java檢索),然后使用GetByteArrayElements檢索它。 記得我不知道我要在手邊檢索的數據大小,因此不能使用NewByteArray函數創建一個字節數組,然后用java代碼中的數據填充它。

好的,我把它弄清楚了。 我會把它放在這里,以便其他人也可以利用它。

考慮以下返回字節數組的java方法(只是一個虛擬代碼,沒有檢查等)

public static byte[] GetData(){
    return myStore.getData();
}

在C端,您可以檢索字節[]如下

    void get_data()
{       
    int len = 0;
    char* value = NULL;
    /*Consider j_class, and j_methodid are already initialized*/
    jbyteArray j_value = (*env)->CallStaticObjectMethod(env, j_class, j_methodid);

    if(j_value != NULL)
    {
        len = (*env)->GetArrayLength(env, j_value);
        value = (*env)->GetByteArrayElements(env, j_value, NULL);
    }

    /*later on release the resource*/
    (*env)->ReleaseByteArrayElements(env, j_value, value, 0);
}

我檢查了它,它的工作原理。 我現在要檢查二維陣列。 我認為只有你得到jobjectArray,並且這個數組的每個元素都是jbyteArray。

非常感謝你! 我試圖將一個雙數組從C傳遞給Java,而java又將一個更新的double數組返回給C.這是JNI的一部分,我試圖將Java代碼鏈接到Fortran源代碼。 但Fortran代碼必須再調用一個Java代碼進行一些計算。 所以我使用JNI從Java到C語言到Fortran到C到Java。 將雙數組從C發送到Java的解決方案和Java將雙數組返回到C的解決方案就在這里。

jdoubleArray tempA = (jdoubleArray)(*envG)->NewDoubleArray(envG,3); //create an array with 3 elements to be sent to Java
jdoubleArray tempB = (jdoubleArray)(*envG)->NewDoubleArray(envG,3); //This is will be //assigned to returned java double array
(*envG)->SetDoubleArrayRegion(envG,tempA,0,3,(const jdouble *)arr);//need to send the //tempA array to Java. "arr" is the double array coming to C from Fortran!
int leng = 0;
for (i = 0; i < 1; i++) {
//sending an array "tempA" to Java. Java returns tempB, a double array
tempB = (*envG)->CallObjectMethod(envG, obj_print, id_print,(*A),(*B),(*C),tempA);
   if (tempB != NULL){
   for (k = 0; k < 3; k++){
      leng = (*envG)->GetArrayLength(envG, tempB);
     jdouble* value = (*envG)->GetDoubleArrayElements(envG, tempB, NULL);
      printf("FROM JAVA ARRAY %f\n", value[k]);
     } //end for
   } //end if

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM