dvmAbort在GetStringUTFChars中的dvmDecodeIndirectRef中

时间:2015-04-23 11:34:59

标签: android java-native-interface abort

我用jni开发了一个android应用程序。 我在GetStringUTFChars中的dvmDecodeIndirectRef中获得了一个dvmabort。 我只有一次中止。

为什么会这样? 如何解决?

如果有人知道这一点,请教我。

抱歉信息不足。

这是我的代码。

std::string toStdStr(JNIEnv* env, jstring jstr)
{
 const char* chars = env->GetStringUTFChars(jstr, 0);  //<-dvmAbort

 std::string stdstr;

 if( NULL==chars  ) {

  stdstr = "";                 

 }else{

  stdstr = std::string(chars );                 
  env->ReleaseStringUTFChars(jstr, chars );                

 }

 return stdstr;
} 

以下是nkd-stack崩溃转储。

我用xxxxxxxx覆盖私人信息

********** Crash dump: **********
Build fingerprint: 'xxxxxxxx'
pid: xxxxxxxx, tid: xxxxxxxx, name: Thread-78  >>> xxxxxxxx <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Stack frame #00  pc xxxxxxxx  /system/lib/libc.so (tgkill+12)
Stack frame #01  pc xxxxxxxx  /system/lib/libc.so (pthread_kill+48)
Stack frame #02  pc xxxxxxxx  /system/lib/libc.so (raise+10)
Stack frame #03  pc xxxxxxxx  /system/lib/libc.so
Stack frame #04  pc xxxxxxxx  /system/lib/libc.so (abort+4)
Stack frame #05  pc xxxxxxxx  /system/lib/libdvm.so (dvmAbort+78)
Stack frame #06  pc xxxxxxxx  /system/lib/libdvm.so (dvmDecodeIndirectRef(Thread*, _jobject*)+146)
Stack frame #07  pc xxxxxxxx  /system/lib/libdvm.so
Stack frame #08  pc xxxxxxxx  /system/vendor/lib/libxxxxxxxx.so toStdStr(_JNIEnv*, _jstring*)+56): Routine _JNIEnv::GetStringUTFChars(_jstring*, unsigned char*) at /home/softdev/opt/android-ndk-r9d/platforms/android-19/arch-arm/usr/include/jni.h:879
...

谢谢!

2015/04/30添加后记

我发现在jni.cpp的第365行的ReportJniError中调用了中止。

Cross Reference: /dalvik/vm/Jni.cpp

这是默认路径。 它什么时候发生? 有什么条件来到这里?

1 个答案:

答案 0 :(得分:1)

这意味着toStdStr传递给env->CreateGlobalRef(jstr)时无效。在 toStdStr致电前尝试{{1}} 。不要忘记发布全球参考。