将jobjectarray转换为vector <uint8_t>

时间:2015-09-03 22:31:02

标签: java c++ java-native-interface byte

我正在使用JNI从java传递一个jobjectarray(实际上是一个byte [] [])。

我要将它转换为uint8_t *或vector(最好是后者)形式的可用“字节数组”,以便它与我在这些表单中使用它的所有现有代码兼容。

关于我如何做到这一点的任何建议?如果那更干净的话,打开使用jbytearray ......

1 个答案:

答案 0 :(得分:2)

我不确定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);

虽然比[{1}}更有效的方法可能是使用byte[][]获得的java.nio.ByteBuffer