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
。