[英]Retrieving byte array of unknown length from Java store
我已經發布了一個關於它的問題,但那時我還沒有賬號。 我得到了答復,但我仍然感到困惑,我不能繼續這個帖子。
我將再次發布問題以及之前對話的鏈接。
我用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.