0

我提供了一个std::set<int>对象,我需要将其转换/复制为jintArray返回 Android 应用程序。我尝试了下面的代码,但它似乎让我的应用程序崩溃,只有这个作为线索:

致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 19975 中的故障地址 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";
    }
}
4

2 回答 2

1

SetIntArrayRegion()需要一个数组作为源缓冲区。您试图一次传递一个 1 的“数组” int。这很好,但正如另一个答案指出的那样,您需要使用(jint*)&theId 而不是 (jint*)theId这样做。

另一种选择是先创建一个实际的数组,然后SetIntArrayRegion()只调用一次以一次性复制整个数组:

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()));
于 2019-07-30T01:00:05.017 回答
0

我认为,你想写(jint*)&theId而不是(jint*)theId.

第二个是说,您想将该数字解释为 jint* 指针。但是你想要 jint* 指向数字的指针。

于 2019-07-29T21:38:54.273 回答