[英]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.