2015-09-03 81 views
0

我使用JNI從java傳遞jobjectarray(實際上是一個byte [] [])。將jobjectarray轉換爲向量<uint8_t>

我想將它轉換成uint8_t *或向量(最好是後者)形式的可用「字節數組」,以便它與所有現有代碼兼容,並以這些形式使用它。

有關如何最好地做到這一點的任何建議?打開使用jbytearray,而不是更清潔...

回答

0

我不確定vector<uint8_t*>是否是一個好主意。 A vector<vector<uint8_t>>可能會更好。

jsize numRows = env->GetArrayLength(objArray); 
vector<vector<uint8_t>> v(numRows); 

寫一個循環,你會得到第n個行從jobjectArray

jbyteArray bytes = (jbyteArray) env->GetObjectArrayElement(objArray, n); 

然後獲得一個指向該行的實際字節,然後將這些字節到您的載體:

jsize numBytes = env->GetArrayLength(bytes); 
uint8_t *data = (uint8_t*) env->GetByteArrayElements(bytes, NULL); 
std::copy(data, data + numBytes, std::back_inserter(v[n])); 
env->ReleaseByteArrayElements(bytes, JNI_ABORT); 

之後立即刪除本地引用bytes可能是一個好主意,以避免溢出本地引用表,如果你有大量的行S:

env->DeleteLocalRef(bytes); 

雖然更有效的方法比byte[][]可能是使用與allocateDirect獲得java.nio.ByteBuffer