2016-05-26 13 views
0

この原因は何ですか?A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19239 (IntentService[K)間欠的クラッシュ?ネイティブコードがクラッシュするとクラッシュする

C++コードがクラッシュを引き起こしているようです。例外はJavaの土地から捕まえることはできません。クラッシュは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

は、あなたのリターンコールは 'catch'ブロックには本当にですか?例外がない場合、あなたの関数は何を返しますか?それはクラッシュを引き起こす可能性が高いです。 –

答えて

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

関連する問題