diff --git a/platforms/android/service/engine/AndroidManifest.xml b/platforms/android/service/engine/AndroidManifest.xml index 3ada75d0a2..49ece296d3 100644 --- a/platforms/android/service/engine/AndroidManifest.xml +++ b/platforms/android/service/engine/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="219@ANDROID_PLATFORM_VERSION_CODE@" + android:versionName="2.20" > diff --git a/platforms/android/service/engine/CMakeLists.txt b/platforms/android/service/engine/CMakeLists.txt index b1cac9383c..61e6a5f9ea 100644 --- a/platforms/android/service/engine/CMakeLists.txt +++ b/platforms/android/service/engine/CMakeLists.txt @@ -12,14 +12,16 @@ if(ARMEABI_V7A) else() set(ANDROID_PLATFORM_VERSION_CODE "3") endif() +elseif(ARM64_V8A) + set(ANDROID_PLATFORM_VERSION_CODE "4") elseif(ARMEABI_V6) set(ANDROID_PLATFORM_VERSION_CODE "1") elseif(ARMEABI) set(ANDROID_PLATFORM_VERSION_CODE "1") elseif(X86) - set(ANDROID_PLATFORM_VERSION_CODE "4") -elseif(MIPS) set(ANDROID_PLATFORM_VERSION_CODE "5") +elseif(MIPS) + set(ANDROID_PLATFORM_VERSION_CODE "6") else() message(WARNING "Can not automatically determine the value for ANDROID_PLATFORM_VERSION_CODE") endif() diff --git a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp index bb0a34cca8..4585840345 100644 --- a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp +++ b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.cpp @@ -39,44 +39,63 @@ int GetCpuID() #else result = ARCH_UNKNOWN; #endif +#elif defined(__aarch64__) +#ifdef __SUPPORT_AARCH64 + result |= ARCH_AARCH64; #else + result = ARCH_UNKNOWN; +#endif +#elif defined(__arm__) LOGD("Using ARM HW detector"); it = cpu_info.find("Processor"); if (cpu_info.end() != it) { - size_t proc_name_pos = it->second.find(CPU_INFO_ARCH_X86_STR); + size_t proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV7_STR); if (string::npos != proc_name_pos) { + result |= ARCH_ARMv7; } else { - proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV7_STR); + proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV6_STR); if (string::npos != proc_name_pos) { - result |= ARCH_ARMv7; + result |= ARCH_ARMv6; } else { - proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV6_STR); + proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV5_STR); if (string::npos != proc_name_pos) { - result |= ARCH_ARMv6; + result |= ARCH_ARMv5; } else { - proc_name_pos = it->second.find(CPU_INFO_ARCH_ARMV5_STR); - if (string::npos != proc_name_pos) - { - result |= ARCH_ARMv5; - } + // Treat the arch of current binary. Google Play checks + // device hardware before installation. Let's assume that + // if the binary works, it's compatible with current hardware +#if defined __ARM_ARCH_7A__ + result |= ARCH_ARMv7; + result |= FEATURES_HAS_VFPv3d16; +#else + result |= ARCH_ARMv5; +#endif } } } } else { - return ARCH_UNKNOWN; + // Treat the arch of current binary. Google Play checks + // device hardware before installation. Let's assume that + // if the binary works, it's compatible with current hardware +#if defined __ARM_ARCH_7A__ + result |= ARCH_ARMv7; + result |= FEATURES_HAS_VFPv3; +#else + result |= ARCH_ARMv5; +#endif } it = cpu_info.find("Features"); @@ -107,7 +126,9 @@ int GetCpuID() } } } - #endif +#else + result = ARCH_UNKNOWN; +#endif return result; } diff --git a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h index 1e14ba7015..0b8b9aabeb 100644 --- a/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h +++ b/platforms/android/service/engine/jni/BinderComponent/HardwareDetector.h @@ -9,7 +9,7 @@ #define ARCH_ARMv5 67108864L #define ARCH_ARMv6 134217728L #define ARCH_ARMv7 268435456L -#define ARCH_ARMv8 536870912L +#define ARCH_AARCH64 536870912L #define ARCH_MIPS 1073741824L #define FEATURES_HAS_VFPv3d16 1L diff --git a/platforms/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp b/platforms/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp index 2b113b4e22..3103059d17 100644 --- a/platforms/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp +++ b/platforms/android/service/engine/jni/BinderComponent/OpenCVEngine.cpp @@ -15,7 +15,7 @@ using namespace android; const int OpenCVEngine::Platform = DetectKnownPlatforms(); const int OpenCVEngine::CpuID = GetCpuID(); -const int OpenCVEngine::KnownVersions[] = {2040000, 2040100, 2040200, 2040300, 2040301, 2040302, 2040400, 2040500, 2040600, 2040700, 2040701, 2040800, 2040900}; +const int OpenCVEngine::KnownVersions[] = {2040000, 2040100, 2040200, 2040300, 2040301, 2040302, 2040400, 2040500, 2040600, 2040700, 2040701, 2040800, 2040900, 2041000, 2041100}; bool OpenCVEngine::ValidateVersion(int version) { diff --git a/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp b/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp index 5c5022ff48..69a36793b0 100644 --- a/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp +++ b/platforms/android/service/engine/jni/NativeService/CommonPackageManager.cpp @@ -208,6 +208,11 @@ std::vector > CommonPackageManager::InitArmRating() result.push_back(std::pair(PLATFORM_TEGRA4, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); result.push_back(std::pair(PLATFORM_TEGRA5, ARCH_ARMv7 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4 | FEATURES_HAS_NEON)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_AARCH64)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_AARCH64 | FEATURES_HAS_VFPv3)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_AARCH64 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv4)); + result.push_back(std::pair(PLATFORM_UNKNOWN, ARCH_AARCH64 | FEATURES_HAS_VFPv3 | FEATURES_HAS_VFPv3 | FEATURES_HAS_NEON)); + return result; } diff --git a/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp b/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp index ca364b444c..d831bf7a5c 100644 --- a/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp +++ b/platforms/android/service/engine/jni/NativeService/PackageInfo.cpp @@ -302,20 +302,13 @@ PackageInfo::PackageInfo(int version, int platform, int cpu_id, std::string inst } #endif } - else if (ARCH_ARMv8 & CpuID) + #ifdef __SUPPORT_AARCH64 + else if (ARCH_AARCH64 & CpuID) { - LOGD("PackageInfo::PackageInfo: package arch ARMv8"); - #ifdef __SUPPORT_ARMEABI_V8 - FullName += string("_") + ARCH_ARMv8_NAME; - #else - FullName += string("_") + ARCH_ARMv7_NAME; - #endif - //string features = JoinARMFeatures(CpuID); - //if (!features.empty()) - //{ - // FullName += string("_") + features; - //} + LOGD("PackageInfo::PackageInfo: package arch AARCH64"); + FullName += string("_") + ARCH_AARCH64_NAME; } + #endif #ifdef __SUPPORT_MIPS else if (ARCH_MIPS & CpuID) { @@ -460,14 +453,22 @@ InstallPath(install_path) { CpuID = ARCH_ARMv7 | SplitARMFeatures(features); } + #ifdef __SUPPORT_AARCH64 + else if (ARCH_AARCH64_NAME == features[2]) + { + CpuID = ARCH_AARCH64 | SplitARMFeatures(features); + } + #endif else if (ARCH_X86_NAME == features[2]) { CpuID = ARCH_X86 | SplitIntelFeatures(features); } + #ifdef __SUPPORT_INTEL_x64 else if (ARCH_X64_NAME == features[2]) { CpuID = ARCH_X64 | SplitIntelFeatures(features); } + #endif #ifdef __SUPPORT_MIPS else if (ARCH_MIPS_NAME == features[2]) { diff --git a/platforms/android/service/engine/jni/NativeService/PackageInfo.h b/platforms/android/service/engine/jni/NativeService/PackageInfo.h index f94f0f3827..7e31e16a10 100644 --- a/platforms/android/service/engine/jni/NativeService/PackageInfo.h +++ b/platforms/android/service/engine/jni/NativeService/PackageInfo.h @@ -10,7 +10,7 @@ #define ARCH_ARMv5_NAME "armv5" #define ARCH_ARMv6_NAME "armv6" #define ARCH_ARMv7_NAME "armv7a" -#define ARCH_ARMv8_NAME "armv8" +#define ARCH_AARCH64_NAME "aarch64" #define FEATURES_HAS_VFPv3d16_NAME "vfpv3d16" #define FEATURES_HAS_VFPv3_NAME "vfpv3" diff --git a/platforms/android/service/engine/jni/Tests/HardwareDetectionTest.cpp b/platforms/android/service/engine/jni/Tests/HardwareDetectionTest.cpp index 8e7dfab006..fd276e9f92 100644 --- a/platforms/android/service/engine/jni/Tests/HardwareDetectionTest.cpp +++ b/platforms/android/service/engine/jni/Tests/HardwareDetectionTest.cpp @@ -146,11 +146,19 @@ TEST(CpuID, CheckMips) EXPECT_TRUE(cpu_id & ARCH_MIPS); } #endif +#elif defined(__aarch64__) +TEST(CpuID, CheckAarch64) +{ + int cpu_id = GetCpuID(); + EXPECT_TRUE(cpu_id & ARCH_AARCH64); +} #else +# if defined(__arm__) && defined(USE_TEGRA_HW_DETECTOR) TEST(TegraDetector, Detect) { EXPECT_TRUE(DetectTegra() != 0); } +# endif TEST(CpuID, CheckArmV7) { diff --git a/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp b/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp index de6b224536..253607ca82 100644 --- a/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp +++ b/platforms/android/service/engine/jni/Tests/PackageInfoTest.cpp @@ -52,6 +52,13 @@ TEST(PackageInfo, FullNameArmv7VFPv3Neon) #endif } +TEST(PackageInfo, FullNameAarch64) +{ + PackageInfo info(2041000, PLATFORM_UNKNOWN, ARCH_AARCH64); + string name = info.GetFullName(); + EXPECT_STREQ("org.opencv.lib_v24_aarch64", name.c_str()); +} + TEST(PackageInfo, FullNameArmv5) { PackageInfo info(2030000, PLATFORM_UNKNOWN, ARCH_ARMv5); diff --git a/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp b/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp index 14295ecbc7..33af961560 100644 --- a/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp +++ b/platforms/android/service/engine/jni/Tests/PackageManagmentTest.cpp @@ -54,6 +54,16 @@ TEST(PackageManager, GetPackagePathForArmv7) EXPECT_STREQ("/data/data/org.opencv.lib_v23_armv7a/lib", path.c_str()); } +#ifdef __SUPPORT_AARCH64 +TEST(PackageManager, GetPackagePathForAarch64) +{ + PackageManagerStub pm; + EXPECT_TRUE(pm.InstallVersion(2041100, PLATFORM_UNKNOWN, ARCH_AARCH64)); + string path = pm.GetPackagePathByVersion(2041100, PLATFORM_UNKNOWN, ARCH_AARCH64); + EXPECT_STREQ("/data/data/org.opencv.lib_v24_aarch64/lib", path.c_str()); +} +#endif + TEST(PackageManager, GetPackagePathForArmv7Neon) { PackageManagerStub pm; diff --git a/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java b/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java index 1d52f0cf0f..f115070aad 100644 --- a/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java +++ b/platforms/android/service/engine/src/org/opencv/engine/HardwareDetector.java @@ -10,7 +10,7 @@ public class HardwareDetector public static final int ARCH_ARMv5 = 0x04000000; public static final int ARCH_ARMv6 = 0x08000000; public static final int ARCH_ARMv7 = 0x10000000; - public static final int ARCH_ARMv8 = 0x20000000; + public static final int ARCH_AARCH64 = 0x20000000; public static final int ARCH_MIPS = 0x40000000; // Platform specific features diff --git a/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java b/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java index 0cd2fd58ef..d0fe6f0d73 100644 --- a/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java +++ b/platforms/android/service/engine/src/org/opencv/engine/manager/ManagerActivity.java @@ -7,6 +7,7 @@ import java.util.StringTokenizer; import org.opencv.engine.HardwareDetector; import org.opencv.engine.MarketConnector; import org.opencv.engine.OpenCVEngineInterface; +import org.opencv.engine.OpenCVEngineService; import org.opencv.engine.OpenCVLibraryInfo; import org.opencv.engine.R; import android.annotation.TargetApi; @@ -140,11 +141,11 @@ public class ManagerActivity extends Activity } else if ((CpuId & HardwareDetector.ARCH_ARMv7) == HardwareDetector.ARCH_ARMv7) { - HardwarePlatformView.setText("ARM v7 " + JoinArmFeatures(CpuId)); + HardwarePlatformView.setText("ARM v7a " + JoinArmFeatures(CpuId)); } - else if ((CpuId & HardwareDetector.ARCH_ARMv8) == HardwareDetector.ARCH_ARMv8) + else if ((CpuId & HardwareDetector.ARCH_AARCH64) == HardwareDetector.ARCH_AARCH64) { - HardwarePlatformView.setText("ARM v8 " + JoinArmFeatures(CpuId)); + HardwarePlatformView.setText("AARCH64 (ARM64 v8a) " + JoinArmFeatures(CpuId)); } else if ((CpuId & HardwareDetector.ARCH_MIPS) == HardwareDetector.ARCH_MIPS) { @@ -220,7 +221,8 @@ public class ManagerActivity extends Activity public void onReceive(Context context, Intent intent) { Log.d("OpenCVManager/Receiver", "Broadcast message " + intent.getAction() + " receiver"); Log.d("OpenCVManager/Receiver", "Filling package list on broadcast message"); - if (!bindService(new Intent("org.opencv.engine.BIND"), new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE)) + if (!bindService(new Intent("org.opencv.engine.BIND"), + new OpenCVEngineServiceConnection(), Context.BIND_AUTO_CREATE)) { TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue); EngineVersionView.setText("not avaliable"); @@ -251,7 +253,7 @@ public class ManagerActivity extends Activity if (HardwareDetector.mIsReady) { Log.d(TAG, "Filling package list on resume"); OpenCVEngineServiceConnection connection = new OpenCVEngineServiceConnection(); - if (!bindService(new Intent("org.opencv.engine.BIND"), connection, Context.BIND_AUTO_CREATE)) { + if (!bindService(new Intent(this, OpenCVEngineService.class), connection, Context.BIND_AUTO_CREATE)) { Log.e(TAG, "Cannot bind to OpenCV Manager service!"); TextView EngineVersionView = (TextView)findViewById(R.id.EngineVersionValue); if (EngineVersionView != null)