diff --git a/android/scripts/cmake_android_service.sh b/android/scripts/cmake_android_service.sh index a5a3d50ade..0dbd482520 100755 --- a/android/scripts/cmake_android_service.sh +++ b/android/scripts/cmake_android_service.sh @@ -5,5 +5,3 @@ mkdir -p build_service cd build_service cmake -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake -DANDROID_TOOLCHAIN_NAME="arm-linux-androideabi-4.4.3" -DANDROID_STL=stlport_static -DANDROID_STL_FORCE_FEATURES=OFF -DBUILD_ANDROID_SERVICE=ON -DANDROID_SOURCE_TREE=~/Projects/AndroidSource/ServiceStub/ $@ ../.. - -#-DANDROID_TOOLCHAIN_NAME="arm-linux-androideabi-4.4.3" diff --git a/android/service/engine/CMakeLists.txt b/android/service/engine/CMakeLists.txt index 9ed6ee5cf5..8b88393942 100644 --- a/android/service/engine/CMakeLists.txt +++ b/android/service/engine/CMakeLists.txt @@ -64,12 +64,12 @@ get_target_property(engine_lib_location ${engine}_jni LOCATION) add_custom_command(TARGET ${engine}_jni POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${engine_lib_location}") # native tests -add_definitions(-DGTEST_HAS_CLONE=0 -DGTEST_OS_LINUX_ANDROID=1 -DGTEST_HAS_TR1_TUPLE=0) +add_definitions(-DGTEST_HAS_CLONE=0 -DANDROID -DGTEST_HAS_TR1_TUPLE=0) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-allow-shlib-undefined") include_directories(${CMAKE_CURRENT_SOURCE_DIR}/jni/Tests) file(GLOB engine_test_files "jni/Tests/*.cpp") -add_executable(opencv_engine_test ${engine_test_files} jni/Tests/gtest/gtest-all.cpp) -target_link_libraries(opencv_engine_test z binder log utils android_runtime ${engine} ${engine}_jni) +add_executable(opencv_test_engine ${engine_test_files} jni/Tests/gtest/gtest-all.cpp) +target_link_libraries(opencv_test_engine z binder log utils android_runtime ${engine} ${engine}_jni) diff --git a/android/service/engine/jni/NativeService/CommonPackageManager.cpp b/android/service/engine/jni/NativeService/CommonPackageManager.cpp index 9e1ffaa98a..dbcd8ff689 100644 --- a/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -80,17 +80,21 @@ string CommonPackageManager::GetPackagePathByVersion(int version, int platform, if (!packages.empty()) { - int OptRating = -1; - int OptVersion = 0; - std::vector >& group = CommonPackageManager::ArmRating; + int platform_group = 0; if ((cpu_id & ARCH_X86) || (cpu_id & ARCH_X64)) - group = CommonPackageManager::IntelRating; + platform_group = 1; - int HardwareRating = GetHardwareRating(platform, cpu_id, group); - LOGD("Current hardware platform rating %d for (%d,%d)", HardwareRating, platform, cpu_id); + if (cpu_id & ARCH_MIPS) + platform_group = 2; - if (-1 == HardwareRating) + int opt_rating = -1; + int opt_version = 0; + + const int hardware_rating = GetHardwareRating(platform, cpu_id, ArchRatings[platform_group]); + LOGD("Current hardware platform rating %d for (%d,%d)", hardware_rating, platform, cpu_id); + + if (-1 == hardware_rating) { LOGE("Cannot calculate rating for current hardware platform!"); } @@ -99,26 +103,38 @@ string CommonPackageManager::GetPackagePathByVersion(int version, int platform, vector::iterator found = packages.end(); for (vector::iterator it = packages.begin(); it != packages.end(); ++it) { - int PackageRating = GetHardwareRating(it->GetPlatform(), it->GetCpuID(), group); - LOGD("Package \"%s\" rating %d for (%d,%d)", it->GetFullName().c_str(), PackageRating, it->GetPlatform(), it->GetCpuID()); - if ((PackageRating >= 0) && (PackageRating <= HardwareRating)) + int package_group = 0; + + if ((it->GetCpuID() & ARCH_X86) || (it->GetCpuID() & ARCH_X64)) + package_group = 1; + + if (it->GetCpuID() & ARCH_MIPS) + package_group = 2; + + if (package_group != platform_group) + continue; + + const int package_rating = GetHardwareRating(it->GetPlatform(), it->GetCpuID(), ArchRatings[package_group]); + + LOGD("Package \"%s\" rating %d for (%d,%d)", it->GetFullName().c_str(), package_rating, it->GetPlatform(), it->GetCpuID()); + if ((package_rating >= 0) && (package_rating <= hardware_rating)) { - if (((it->GetVersion() >= OptVersion) && (PackageRating >= OptRating)) || (it->GetVersion() > OptVersion)) + if (((it->GetVersion() >= opt_version) && (package_rating >= opt_rating)) || (it->GetVersion() > opt_version)) { - OptRating = PackageRating; - OptVersion = it->GetVersion(); + opt_rating = package_rating; + opt_version = it->GetVersion(); found = it; } } } - if ((-1 != OptRating) && (packages.end() != found)) + if ((-1 != opt_rating) && (packages.end() != found)) { result = found->GetInstalationPath(); } else { - LOGI("Found package is incompatible with current hardware platform"); + LOGI("No compatible packages found!"); } } } @@ -146,10 +162,13 @@ int CommonPackageManager::GetHardwareRating(int platform, int cpu_id, const std: else { // Calculate rating for Arm + LOGD("!!! Calculating rating for ARM\n"); for (size_t i = 0; i < group.size(); i++) { + LOGD("Checking (%d, %d) against (%d,%d)\n", group[i].first, group[i].second, platform, cpu_id); if (group[i] == std::pair(platform, cpu_id)) { + LOGD("Rating found: %d\n", i); result = i; break; } @@ -182,21 +201,27 @@ std::vector > CommonPackageManager::InitArmRating() return result; } +// Stub for Intel platforms rating initialization. Common package for all Intel based devices is used now std::vector > CommonPackageManager::InitIntelRating() { std::vector > result; - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_X64)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSSE3)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSE2)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_X86 | FEATURES_HAS_SSE)); - result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_X86)); + return result; +} + +// Stub for MIPS platforms rating initialization. Common package for all MIPS based devices is used now +std::vector > CommonPackageManager::InitMipsRating() +{ + std::vector > result; return result; } -std::vector > CommonPackageManager::IntelRating = CommonPackageManager::InitIntelRating(); -std::vector > CommonPackageManager::ArmRating = InitArmRating(); +const std::vector > CommonPackageManager::ArchRatings[] = { + CommonPackageManager::InitArmRating(), + CommonPackageManager::InitIntelRating(), + CommonPackageManager::InitMipsRating() + }; CommonPackageManager::~CommonPackageManager() { diff --git a/android/service/engine/jni/NativeService/CommonPackageManager.h b/android/service/engine/jni/NativeService/CommonPackageManager.h index c02eb322e5..6d5d6aa64d 100644 --- a/android/service/engine/jni/NativeService/CommonPackageManager.h +++ b/android/service/engine/jni/NativeService/CommonPackageManager.h @@ -16,11 +16,11 @@ public: virtual ~CommonPackageManager(); protected: - static std::vector > ArmRating; - static std::vector > IntelRating; + static const std::vector > ArchRatings[]; static std::vector > InitArmRating(); static std::vector > InitIntelRating(); + static std::vector > InitMipsRating(); bool IsVersionCompatible(int target_version, int package_version); int GetHardwareRating(int platform, int cpu_id, const std::vector >& group); diff --git a/android/service/engine/jni/Tests/HardwareDetectionTest.cpp b/android/service/engine/jni/Tests/HardwareDetectionTest.cpp index e4c1284f39..8637dfee30 100644 --- a/android/service/engine/jni/Tests/HardwareDetectionTest.cpp +++ b/android/service/engine/jni/Tests/HardwareDetectionTest.cpp @@ -126,7 +126,7 @@ TEST(CpuID, CheckNotEmpy) EXPECT_NE(0, cpu_id); } -#ifdef __i386__ +#if defined(__i386__) TEST(CpuID, CheckX86) { int cpu_id = GetCpuID(); @@ -138,7 +138,7 @@ TEST(CpuID, CheckSSE2) int cpu_id = GetCpuID(); EXPECT_TRUE(cpu_id & FEATURES_HAS_SSE2); } -#elseif __mips +#elif defined(__mips) #ifdef __SUPPORT_MIPS TEST(CpuID, CheckMips) {