From d55e114f96ee33d78da11680e318d307f5bad10e Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Fri, 14 Sep 2012 17:20:59 +0400 Subject: [PATCH] Issue #2357 OpenCV manager fails to determine hardware platfrom on Tegra2 fixed. --- .../jni/BinderComponent/HardwareDetector.h | 2 +- .../jni/BinderComponent/OpenCVEngine.cpp | 12 ++--- .../NativeService/CommonPackageManager.cpp | 46 ++++++++++--------- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/android/service/engine/jni/BinderComponent/HardwareDetector.h b/android/service/engine/jni/BinderComponent/HardwareDetector.h index ed15134c80..9242143bb0 100644 --- a/android/service/engine/jni/BinderComponent/HardwareDetector.h +++ b/android/service/engine/jni/BinderComponent/HardwareDetector.h @@ -20,7 +20,7 @@ #define FEATURES_HAS_SSSE3 4L #define FEATURES_HAS_GPU 65536L -// TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap +// TODO: Do not forget to add Platrfom name to PackageInfo::PlatformNameMap // in method PackageInfo::InitPlatformNameMap() #define PLATFORM_UNKNOWN 0L #define PLATFORM_TEGRA 1L diff --git a/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp b/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp index f8f7ee4f3c..b1d0779b0e 100644 --- a/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp +++ b/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp @@ -125,23 +125,23 @@ android::String16 OpenCVEngine::GetLibraryList(android::String16 version) if (!tmp.empty()) { tmp += "/libopencvinfo.so"; - + LOGD("Trying to load info library \"%s\"", tmp.c_str()); - + void *handle; char* (*info_func)(); - + handle = dlopen(tmp.c_str(), RTLD_LAZY); if (handle) { const char *error; - - dlerror(); + + dlerror(); *(void **) (&info_func) = dlsym(handle, "GetLibraryList"); if ((error = dlerror()) == NULL) { result = String16((*info_func)()); - dlclose(handle); + dlclose(handle); } else { diff --git a/android/service/engine/jni/NativeService/CommonPackageManager.cpp b/android/service/engine/jni/NativeService/CommonPackageManager.cpp index 99eb7325c2..3da3e8328f 100644 --- a/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -15,14 +15,14 @@ set CommonPackageManager::GetInstalledVersions() { set result; vector installed_packages = GetInstalledPackages(); - + for (vector::const_iterator it = installed_packages.begin(); it != installed_packages.end(); ++it) { string version = it->GetVersion(); assert(!version.empty()); result.insert(version); } - + return result; } @@ -33,12 +33,12 @@ bool CommonPackageManager::CheckVersionInstalled(const std::string& version, int PackageInfo target_package(version, platform, cpu_id); LOGD("GetInstalledPackages() call"); vector packages = GetInstalledPackages(); - + for (vector::const_iterator it = packages.begin(); it != packages.end(); ++it) { LOGD("Found package: \"%s\"", it->GetFullName().c_str()); } - + if (!packages.empty()) { result = (packages.end() != find(packages.begin(), packages.end(), target_package)); @@ -60,7 +60,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, PackageInfo target_package(version, platform, cpu_id); vector all_packages = GetInstalledPackages(); vector packages; - + for (vector::iterator it = all_packages.begin(); it != all_packages.end(); ++it) { LOGD("Check version \"%s\" compatibility with \"%s\"\n", version.c_str(), it->GetVersion().c_str()); @@ -71,10 +71,10 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } else { - LOGD("NOT Compatible"); + LOGD("NOT Compatible"); } } - + if (!packages.empty()) { vector::iterator found = find(packages.begin(), packages.end(), target_package); @@ -86,13 +86,13 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, { int OptRating = -1; std::vector >& group = CommonPackageManager::ArmRating; - + if ((cpu_id & ARCH_X86) || (cpu_id & ARCH_X64)) group = CommonPackageManager::IntelRating; - + int HardwareRating = GetHardwareRating(platform, cpu_id, group); LOGD("Current hardware platform %d, %d", platform, cpu_id); - + if (-1 == HardwareRating) { LOGE("Cannot calculate rating for current hardware platform!"); @@ -111,7 +111,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } } } - + if ((-1 != OptRating) && (packages.end() != found)) { result = found->GetInstalationPath(); @@ -123,7 +123,7 @@ string CommonPackageManager::GetPackagePathByVersion(const std::string& version, } } } - + return result; } @@ -131,22 +131,22 @@ bool CommonPackageManager::IsVersionCompatible(const std::string& target_version { assert (target_version.size() == 3); assert (package_version.size() == 3); - + bool result = false; - + // major version is the same and minor package version is above or the same as target. if ((package_version[0] == target_version[0]) && (package_version[1] == target_version[1]) && (package_version[2] >= target_version[2])) { - result = true; + result = true; } - + return result; } int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std::vector >& group) { int result = -1; - + for (size_t i = 0; i < group.size(); i++) { if (group[i] == std::pair(platform, cpu_id)) @@ -162,19 +162,23 @@ int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std: std::vector > CommonPackageManager::InitArmRating() { std::vector > result; - + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv5)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv6 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_VFPv3)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); - result.push_back(std::pair(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3d16 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_TEGRA2, ARCH_ARMv7 | FEATURES_HAS_VFPv3d16)); result.push_back(std::pair(PLATFORM_TEGRA3, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); - + return result; }