簡體   English   中英

將jobjectarray轉換為向量<uint8_t>

[英]Convert jobjectarray into vector<uint8_t>

我正在使用JNI從Java傳遞一個jobjectarray(實際上是一個byte [] [])。

我會以uint8_t *或vector(最好是后者)的形式將其轉換為可用的“字節數組”,以便它與以這些形式使用它的所有現有代碼兼容。

關於如何最好地做到這一點的任何建議? 如果更干凈,可以使用jbytearray代替...

我不確定vector<uint8_t*>在這里是否是個好主意。 vector<vector<uint8_t>>可能更好。

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

編寫一個循環,從jobjectArray獲取第n行:

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的本地引用可能是個好主意,如果有大量行,可以避免溢出本地引用表:

env->DeleteLocalRef(bytes);

盡管比byte[][]更有效的方法可能是使用通過allocateDirect獲得的java.nio.ByteBuffer

暫無
暫無

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

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