将 jobjectarray 转换为 vector<uint8_t>

Convert jobjectarray into vector<uint8_t>

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

我想以 uint8_t* 或向量(最好是后者)的形式将其转换为可用的 "byte array",以便它与我使用它的所有现有代码兼容在这些表格中。

关于我如何最好地做到这一点有什么建议吗?如果更干净,可以改用 jbytearray...

我不确定 vector<uint8_t*> 在这里是否是个好主意。 vector<vector<uint8_t>> 可能更好。

jsize numRows = env->GetArrayLength(objArray);
vector<vector<uint8_t>> v(numRows);

编写一个循环,从 jobjectArray:

中获取 n:th 行
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 的本地引用可能是个好主意,以避免溢出本地引用 table 如果您有大量行:

env->DeleteLocalRef(bytes);

尽管比 byte[][] 更有效的方法可能是使用通过 allocateDirect 获得的 java.nio.ByteBuffer