我正在使用JNI从java传递一个jobjectarray(实际上是一个byte [] [])。
我要将它转换为uint8_t *或vector(最好是后者)形式的可用“字节数组”,以便它与我在这些表单中使用它的所有现有代码兼容。
关于我如何做到这一点的任何建议?如果那更干净的话,打开使用jbytearray ......
答案 0 :(得分:2)
我不确定vector<uint8_t*>
在这里是不是一个好主意。 vector<vector<uint8_t>>
可能会更好。
jsize numRows = env->GetArrayLength(objArray);
vector<vector<uint8_t>> v(numRows);
写一个循环,从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
的本地引用可能是一个好主意,以避免在您有大量行的情况下溢出本地参考表:
env->DeleteLocalRef(bytes);
虽然比[{1}}更有效的方法可能是使用byte[][]
获得的java.nio.ByteBuffer
。