崩溃退出本机代码

时间:2016-05-26 13:14:47

标签: android java-native-interface

A/libc: invalid address or address of corrupt block 0x5da90aa0 passed to dlfreeA/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());
   }
}

我已经阅读了看似相关的帖子,讨论了访问资源的多个线程,我不认为这是问题所在。

1 个答案:

答案 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;
}

我没有观察到崩溃。

这篇文章很有用:https://community.oracle.com/thread/1549127