此A/libc: invalid address or address of corrupt block 0x5da90aa0 passed to dlfree
和A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19239 (IntentService[K)
间接崩溃的原因是什么?
C ++代码似乎正在触发崩溃。没有例外可以从Java-land中获取。在Android 4.4.4上间歇性地观察到崩溃。我没有在Android 6.0上观察到它。
本地入境/出境点代码:
JNIEXPORT jstring
JNICALL Java_com_company_product_ClassJNI_foo(JNIEnv* env, jobject obj, jstring options)
{
const jsize optionLength = env->GetStringUTFLength(options);
std::vector <char> optionsBuffer(static_cast<int>(optionLength));
env->GetStringUTFRegion(options, 0, optionLength, optionsBuffer.data());
const std::string nativeOptions(optionsBuffer.cbegin(), optionsBuffer.cend());
try
{
SerialWrapper si(env, obj);
const std::string result = Procedure::exec(nativeOptions, si);
// gets this far
return env->NewStringUTF(result.c_str());
}
catch (const JObjectError& e)
{
const JSON jsonError{{PROP_ERROR, std::string(e.what())}};
return env->NewStringUTF(jsonError.dump().c_str());
}
}
我已经阅读了看似相关的帖子,讨论了访问资源的多个线程,我不认为这是问题所在。
答案 0 :(得分:0)
我没有在前几行正确管理本机字符串资源:
// problematic
const jsize optionLength = env->GetStringUTFLength(options);
std::vector <char> optionsBuffer(static_cast<int>(optionLength));
env->GetStringUTFRegion(options, 0, optionLength, optionsBuffer.data());
const std::string nativeOptions(optionsBuffer.cbegin(), optionsBuffer.cend());
当在本机退出时发生清理时,发生了不正当的释放。
创建/使用此实用程序功能后:
std::string createStdString(JNIEnv& env, jstring& javaString)
{
// appears to work
const char* rawString = env.GetStringUTFChars(javaString, nullptr);
const std::string nativeString(rawString);
env.ReleaseStringUTFChars(javaString, rawString);
return nativeString;
}
我没有观察到崩溃。