From 9f9c333a26d8575431d9739bb75bb4734f31382b Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Mon, 11 Feb 2013 14:12:51 +0400 Subject: [PATCH] Bug #2759 android.os.DeadObjectException on OpenCV Manager connection fixed. DeleteLocalRef calls for jclass objects added. --- .../JNIWrapper/JavaBasedPackageManager.cpp | 25 ++++++++++++++++--- .../jni/JNIWrapper/JavaBasedPackageManager.h | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp index bfef171928..b2d8fd7085 100644 --- a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp +++ b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.cpp @@ -46,7 +46,9 @@ bool JavaBasedPackageManager::InstallPackage(const PackageInfo& package) LOGD("Calling java package manager with package name %s\n", package.GetFullName().c_str()); jobject jpkgname = jenv->NewStringUTF(package.GetFullName().c_str()); bool result = jenv->CallNonvirtualBooleanMethod(JavaPackageManager, jclazz, jmethod, jpkgname); + jenv->DeleteLocalRef(jpkgname); + jenv->DeleteLocalRef(jclazz); if (self_attached) { @@ -104,9 +106,12 @@ vector JavaBasedPackageManager::GetInstalledPackages() if (tmp.IsValid()) result.push_back(tmp); + + jenv->DeleteLocalRef(jtmp); } jenv->DeleteLocalRef(jpkgs); + jenv->DeleteLocalRef(jclazz); if (self_attached) { @@ -118,6 +123,16 @@ vector JavaBasedPackageManager::GetInstalledPackages() return result; } +static jint GetAndroidVersion(JNIEnv* jenv) +{ + jclass jclazz = jenv->FindClass("android/os/Build$VERSION"); + jfieldID jfield = jenv->GetStaticFieldID(jclazz, "SDK_INT", "I"); + jint api_level = jenv->GetStaticIntField(jclazz, jfield); + jenv->DeleteLocalRef(jclazz); + + return api_level; +} + // IMPORTANT: This method can be called only if thread is attached to Dalvik PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNIEnv* jenv) { @@ -133,23 +148,27 @@ PackageInfo JavaBasedPackageManager::ConvertPackageFromJava(jobject package, JNI const char* jversionstr = jenv->GetStringUTFChars(jversionobj, NULL); string verison(jversionstr); jenv->DeleteLocalRef(jversionobj); + jenv->DeleteLocalRef(jclazz); + static const jint api_level = GetAndroidVersion(jenv); string path; - jclazz = jenv->FindClass("android/os/Build$VERSION"); - jfield = jenv->GetStaticFieldID(jclazz, "SDK_INT", "I"); - jint api_level = jenv->GetStaticIntField(jclazz, jfield); if (api_level > 8) { jclazz = jenv->GetObjectClass(package); jfield = jenv->GetFieldID(jclazz, "applicationInfo", "Landroid/content/pm/ApplicationInfo;"); jobject japp_info = jenv->GetObjectField(package, jfield); + jenv->DeleteLocalRef(jclazz); + jclazz = jenv->GetObjectClass(japp_info); jfield = jenv->GetFieldID(jclazz, "nativeLibraryDir", "Ljava/lang/String;"); jstring jpathobj = static_cast(jenv->GetObjectField(japp_info, jfield)); const char* jpathstr = jenv->GetStringUTFChars(jpathobj, NULL); path = string(jpathstr); jenv->ReleaseStringUTFChars(jpathobj, jpathstr); + + jenv->DeleteLocalRef(japp_info); jenv->DeleteLocalRef(jpathobj); + jenv->DeleteLocalRef(jclazz); } else { diff --git a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.h b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.h index 8717ea953d..3ea891455e 100644 --- a/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.h +++ b/android/service/engine/jni/JNIWrapper/JavaBasedPackageManager.h @@ -19,4 +19,4 @@ private: JavaBasedPackageManager(); PackageInfo ConvertPackageFromJava(jobject package, JNIEnv* jenv); -}; \ No newline at end of file +};