0
我使用JNI從java傳遞jobjectarray(實際上是一個byte [] [])。將jobjectarray轉換爲向量<uint8_t>
我想將它轉換成uint8_t *或向量(最好是後者)形式的可用「字節數組」,以便它與所有現有代碼兼容,並以這些形式使用它。
有關如何最好地做到這一點的任何建議?打開使用jbytearray,而不是更清潔...
我使用JNI從java傳遞jobjectarray(實際上是一個byte [] [])。將jobjectarray轉換爲向量<uint8_t>
我想將它轉換成uint8_t *或向量(最好是後者)形式的可用「字節數組」,以便它與所有現有代碼兼容,並以這些形式使用它。
有關如何最好地做到這一點的任何建議?打開使用jbytearray,而不是更清潔...
我不確定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
。