我提供了一个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/

10-10 18:46