Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调用attachCurrentThread时ART下的本机崩溃 我们有一个应用程序,其中大部分代码是用C++编写的。我们正在使用JNI接口。使用此JNI接口将事件回调传递给java。对于每个事件回调,我们都会得到JNIEnv,然后调用该env的AttachCurrentThread。下面是执行此操作的一段代码: CJniEnvUtil::CJniEnvUtil(JavaVM *pvm) : m_fNeedDetach(false) , mJavaVM(pvm) , m_pEnv(NULL) { switch (mJavaVM->GetEnv((void**)&m_pEnv, JNI_VERSION_1_6)) { case JNI_OK: break; case JNI_EDETACHED: if (mJavaVM->AttachCurrentThread(&m_pEnv, NULL) != 0) { break; } m_fNeedDetach = true; break; case JNI_EVERSION: break; } } CJniEnvUtil::~CJniEnvUtil() { if (m_fNeedDetach && m_pEnv) mJavaVM->DetachCurrentThread(); }_Android_Java Native Interface_Native - Fatal编程技术网

Android 调用attachCurrentThread时ART下的本机崩溃 我们有一个应用程序,其中大部分代码是用C++编写的。我们正在使用JNI接口。使用此JNI接口将事件回调传递给java。对于每个事件回调,我们都会得到JNIEnv,然后调用该env的AttachCurrentThread。下面是执行此操作的一段代码: CJniEnvUtil::CJniEnvUtil(JavaVM *pvm) : m_fNeedDetach(false) , mJavaVM(pvm) , m_pEnv(NULL) { switch (mJavaVM->GetEnv((void**)&m_pEnv, JNI_VERSION_1_6)) { case JNI_OK: break; case JNI_EDETACHED: if (mJavaVM->AttachCurrentThread(&m_pEnv, NULL) != 0) { break; } m_fNeedDetach = true; break; case JNI_EVERSION: break; } } CJniEnvUtil::~CJniEnvUtil() { if (m_fNeedDetach && m_pEnv) mJavaVM->DetachCurrentThread(); }

Android 调用attachCurrentThread时ART下的本机崩溃 我们有一个应用程序,其中大部分代码是用C++编写的。我们正在使用JNI接口。使用此JNI接口将事件回调传递给java。对于每个事件回调,我们都会得到JNIEnv,然后调用该env的AttachCurrentThread。下面是执行此操作的一段代码: CJniEnvUtil::CJniEnvUtil(JavaVM *pvm) : m_fNeedDetach(false) , mJavaVM(pvm) , m_pEnv(NULL) { switch (mJavaVM->GetEnv((void**)&m_pEnv, JNI_VERSION_1_6)) { case JNI_OK: break; case JNI_EDETACHED: if (mJavaVM->AttachCurrentThread(&m_pEnv, NULL) != 0) { break; } m_fNeedDetach = true; break; case JNI_EVERSION: break; } } CJniEnvUtil::~CJniEnvUtil() { if (m_fNeedDetach && m_pEnv) mJavaVM->DetachCurrentThread(); },android,java-native-interface,native,Android,Java Native Interface,Native,因此,我们的想法是,对于每个事件回调,我们都创建这个CJniEnvUtil的实例,它依次获取当前线程的env并附加当前线程。当此对象为析构函数时,此线程将被分离。 在Dalvic上,这段代码工作得非常好,但在ART(Android运行时)上,它正在崩溃(事实上,理智失败)。 以下是来自logcat的完整堆栈跟踪 A/art﹕ art/runtime/thread.cc:468] Check failed: &stack_variable > reinterpret_cast<

因此,我们的想法是,对于每个事件回调,我们都创建这个
CJniEnvUtil
的实例,它依次获取当前线程的env并附加当前线程。当此对象为析构函数时,此线程将被分离。 在Dalvic上,这段代码工作得非常好,但在ART(Android运行时)上,它正在崩溃(事实上,理智失败)。 以下是来自logcat的完整堆栈跟踪

A/art﹕ art/runtime/thread.cc:468] Check failed: &stack_variable > reinterpret_cast<void*>          (stack_end_) (&stack_variable=0x4cd061b0, reinterpret_cast<void*>(stack_end_)=0x50014000)
I/AudioFlinger﹕ BUFFER TIMEOUT: remove(4098) from active list on thread 0xb5e81008
A/art﹕ art/runtime/runtime.cc:203] Runtime aborting...
A/art﹕ art/runtime/runtime.cc:203] Aborting thread:
A/art﹕ art/runtime/runtime.cc:203] "<native thread without managed peer>" prio=5 tid=27 Runnable (still starting up)
A/art﹕ art/runtime/runtime.cc:203]   | group="" sCount=0 dsCount=0 obj=0x00000000 self=0x497e4830
A/art﹕ art/runtime/runtime.cc:203]   | sysTid=10564 nice=0 cgrp=apps sched=0/0 handle=0x4f2e9cd0
A/art﹕ art/runtime/runtime.cc:203]   | state=R schedstat=( 3985475838 2078977182 16206 ) utm=335 stm=63 core=0 HZ=100
A/art﹕ art/runtime/runtime.cc:203]   | stack=0x50010000-0x50014000 stackSize=1016KB
A/art﹕ art/runtime/runtime.cc:203]   native: art::Thread::DumpStack(std::ostream&) const+87         
A/art﹕ art/runtime/runtime.cc:203]   native: art::Runtime::Abort()+79 [0x41634974] (libart.so)
A/art﹕ art/runtime/runtime.cc:203]   native: art::LogMessage::~LogMessage()+505 [0x414e193a] (libart.so)
A/art﹕ art/runtime/runtime.cc:203]   native: art::Thread::InitStackHwm()+849 [0x4163da9a] (libart.so)
A/art﹕ art/runtime/runtime.cc:203]   native: art::Thread::Init(art::ThreadList*,      art::JavaVMExt*)+499 [0x4163dd78] (libart.so)
A/art﹕ art/runtime/runtime.cc:203]   native: art::Thread::Attach(char const*, bool, _jobject*,  bool)+103 [0x41645250] (libart.so)
A/art﹕ art/runtime/runtime.cc:203]   native: art::Runtime::AttachCurrentThread(char const*,  bool, _jobject*, bool)+15 [0x41632b38] (libart.so)
A/art﹕ art/runtime/thread.cc:468]检查失败:&堆栈变量>重新解释转换(堆栈结束)(堆栈变量=0x4cd061b0,重新解释转换(堆栈结束)=0x50014000)
I/AudioFlinger﹕ 缓冲区超时:从线程0xb5e81008的活动列表中删除(4098)
A/艺术﹕ art/runtime/runtime.cc:203]运行时中止。。。
A/艺术﹕ art/runtime/runtime.cc:203]正在中止线程:
A/艺术﹕ art/runtime/runtime.cc:203]“prio=5 tid=27 Runnable(仍在启动)
A/艺术﹕ art/runtime/runtime.cc:203]| group=”“scont=0 dsCount=0 obj=0x00000000 self=0x497e4830
A/艺术﹕ art/runtime/runtime.cc:203]| sysTid=10564 nice=0 cgrp=apps sched=0/0 handle=0x4f2e9cd0
A/艺术﹕ art/runtime/runtime.cc:203]| state=R schedstat=(3985475838 2078977182 16206)utm=335 stm=63 core=0 HZ=100
A/艺术﹕ art/runtime/runtime.cc:203]| stack=0x50010000-0x50014000 stackSize=1016KB
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::Thread::DumpStack(std::ostream&)const+87
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::runtime::Abort()+79[0x41634974](libart.so)
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::LogMessage::~LogMessage()+505[0x414e193a](libart.so)
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::Thread::InitStackHwm()+849[0x4163da9a](libart.so)
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::Thread::Init(art::ThreadList*,art::JavaVMExt*)+499[0x4163dd78](libart.so)
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::Thread::Attach(char const*,bool,_jobject*,bool)+103[0x41645250](libart.so)
A/艺术﹕ art/runtime/runtime.cc:203]本机:art::runtime::AttachCurrentThread(char const*,bool,_jobject*,bool)+15[0x41632b38](libart.so)
如第一行所示,健全性检查失败


如果有人能就此提出建议,我将不胜感激。我必须让应用程序在Android 5.0上运行,Android 5.0将ART作为默认运行时。

Dalvik对本机代码和Java代码有单独的堆栈,默认Java堆栈大小为32KB,默认本机堆栈大小为1MB。艺术有一个统一的堆栈,以便更好地定位。通常情况下,艺术线程堆栈大小应与Dalvik大致相同。但是,如果显式设置堆栈大小,则可能需要重新访问ART中运行的应用程序的这些值

在Java中,检查对指定显式堆栈大小的线程构造函数的调用。例如,如果发生StackOverflowerError,则需要增加大小。 在C/C++中,检查pthread_attr_setstack()和pthread_attr_setstacksize()对于也通过JNI运行Java代码的线程的使用情况。以下是当pthread size太小时,应用程序尝试调用JNI AttachCurrentThread()时记录的错误示例: F/art:art/runtime/thread.cc:435] 尝试附加堆栈太小(16384字节)的线程

请参阅:11观察pthread size(pthreat_attr_setstack()和pthreat_attr_setstacksize()),因为包含AttachCurrentThread()的调用将引发错误。