issues #2899:Fix application will crash when back to background on Android.

This commit is contained in:
Dhilan007 2013-10-09 18:09:24 +08:00
parent 20971b0ad2
commit 7756c77651
3 changed files with 14 additions and 4 deletions

View File

@ -58,6 +58,8 @@ namespace cocos2d {
jobject JniHelper::classloader = NULL;
JNIEnv* JniHelper::env = NULL;
static pthread_key_t thread_key;
JavaVM* JniHelper::getJavaVM() {
pthread_t thisthread = pthread_self();
LOGD("JniHelper::getJavaVM(), pthread_self() = %X", thisthread);
@ -72,6 +74,10 @@ namespace cocos2d {
JniHelper::cacheEnv(javaVM);
}
void JniHelper::detach_current_thread (void *env) {
_psJavaVM->DetachCurrentThread();
}
bool JniHelper::cacheEnv(JavaVM* jvm) {
JNIEnv* _env = NULL;
// get jni environment
@ -89,7 +95,8 @@ namespace cocos2d {
// TODO : If calling AttachCurrentThread() on a native thread
// must call DetachCurrentThread() in future.
// see: http://developer.android.com/guide/practices/design/jni.html
pthread_key_create (&thread_key, JniHelper::detach_current_thread);
if (jvm->AttachCurrentThread(&_env, NULL) < 0)
{
LOGD("Failed to get the environment using AttachCurrentThread()");
@ -99,6 +106,8 @@ namespace cocos2d {
} else {
// Success : Attached and obtained JNIEnv!
JniHelper::env = _env;
if (pthread_getspecific(thread_key) == NULL)
pthread_setspecific(thread_key, _env);
return true;
}

View File

@ -60,6 +60,7 @@ public:
static jobject classloader;
private:
static void detach_current_thread (void *env);
static bool cacheEnv(JavaVM* jvm);
static bool getMethodInfo_DefaultClassLoader(JniMethodInfo &methodinfo,

View File

@ -215,10 +215,10 @@ static cocos_dimensions engine_init_display(struct engine* engine) {
/**
* Invoke the dispatching of the next bunch of Runnables in the Java-Land
*/
static bool initialized = false;
static void dispatch_pending_runnables() {
static cocos2d::JniMethodInfo info;
static bool initialized = false;
if (!initialized) {
initialized = cocos2d::JniHelper::getStaticMethodInfo(
info,
@ -652,7 +652,7 @@ void android_main(struct android_app* state) {
engine_term_display(&engine);
memset(&engine, 0, sizeof(engine));
initialized = false;
return;
}
}