我提供了一个std::set<int>
对象,我需要将其转换/复制为jintArray
才能返回到Android应用。我尝试了下面的代码,但似乎仅以此为线索就使我的应用程序崩溃了:
TID 19975中的致命信号11(SIGSEGV),代码1(SEGV_MAPERR),故障加法器0x2
我怀疑这是演员,但是我不确定这样做的正确方法。 theId
绝对是int
。请参见下面的代码:
std::set<int> speciesSet = someFunctionThatReturnsASet();
speciesIDSet = env->NewIntArray(speciesSet.size());
int count = 0;
for ( std::set<int>::iterator itr=speciesSet.begin(); itr != speciesSet.end(); itr++ ) {
try {
int theId = *itr;
// This is the last line of code that runs.
env->SetIntArrayRegion(speciesIDSet, count, 1, (jint*)theId);
count++;
}
catch (const std::exception& e) {
std::cout << e.what();
}
catch (...) {
std::cout << "oops";
}
}
最佳答案
SetIntArrayRegion()
需要一个数组作为源缓冲区。您正在尝试一次传递1个int
的“数组”。很好,但是正如另一个答案指出的那样,您需要使用(jint*)&theId
而不是(jint*)theId
来做到这一点。
另一种选择是先创建一个实际的数组,然后仅调用SetIntArrayRegion()
1次以一次复制整个数组:
std::set<int> speciesSet = someFunctionThatReturnsASet();
std::vector<int> speciesVec(speciesSet.begin(), speciesSet.end());
speciesIDSet = env->NewIntArray(speciesVec.size());
env->SetIntArrayRegion(speciesIDSet, 0, speciesVec.size(), reinterpret_cast<jint*>(speciesVec.data()));
关于c++ - 将std:set <int>转换为jintArray,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57261574/