2015-09-03 53 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