我已經發布了一個關於它的問題,但那時我還沒有賬戶。我得到了答覆,但我仍然感到困惑,我無法繼續這個話題。從Java商店檢索未知長度的字節數組
我再次發佈該問題以及與之前對話的鏈接。
Returning char array from java to string - 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代碼中的數據填充它。
謝謝我遇到了完全相同的問題,這段代碼很有幫助。在VisualStudio中,我必須包含一些強制轉換才能編譯它,但我必須使用(jbyteArray)從CallStaticObjectMethod中返回值,並且必須使用(char *) – 2009-08-28 22:19:32
從GetByteArrayElements強制返回值謝謝! 4年後,我在env->方法中遇到了同樣的問題,無法讀取字節數組字段。此解決方案工作:) – blkhatpersian 2014-03-11 23:00:30