diff --git a/platforms/android/build_sdk.py b/platforms/android/build_sdk.py index 296feb59bf..ce6f982c0c 100755 --- a/platforms/android/build_sdk.py +++ b/platforms/android/build_sdk.py @@ -60,6 +60,39 @@ def determine_opencv_version(version_hpp_path): version_status = re.search(r'^#define\W+CV_VERSION_STATUS\W+"([^"]*)"$', data, re.MULTILINE).group(1) return "%(major)s.%(minor)s.%(revision)s%(version_status)s" % locals() +# shutil.move fails if dst exists +def move_smart(src, dst): + def move_recurse(subdir): + s = os.path.join(src, subdir) + d = os.path.join(dst, subdir) + if os.path.exists(d): + if os.path.isdir(d): + for item in os.listdir(s): + move_recurse(os.path.join(subdir, item)) + elif os.path.isfile(s): + shutil.move(s, d) + else: + shutil.move(s, d) + move_recurse('') + +# shutil.copytree fails if dst exists +def copytree_smart(src, dst): + def copy_recurse(subdir): + s = os.path.join(src, subdir) + d = os.path.join(dst, subdir) + if os.path.exists(d): + if os.path.isdir(d): + for item in os.listdir(s): + copy_recurse(os.path.join(subdir, item)) + elif os.path.isfile(s): + shutil.copy2(s, d) + else: + if os.path.isdir(s): + shutil.copytree(s, d) + elif os.path.isfile(s): + shutil.copy2(s, d) + copy_recurse('') + #=================================================================================================== class ABI: @@ -88,13 +121,14 @@ ABIs = [ #=================================================================================================== class Builder: - def __init__(self, workdir, opencvdir): + def __init__(self, workdir, opencvdir, config): self.workdir = check_dir(workdir, create=True) self.opencvdir = check_dir(opencvdir) + self.config = config self.extra_modules_path = None self.libdest = check_dir(os.path.join(self.workdir, "o4a"), create=True, clean=True) - self.docdest = check_dir(os.path.join(self.workdir, "javadoc"), create=True, clean=True) - self.resultdest = check_dir(os.path.join(self.workdir, "OpenCV-android-sdk"), create=True, clean=True) + self.resultdest = check_dir(os.path.join(self.workdir, 'OpenCV-android-sdk'), create=True, clean=True) + self.docdest = check_dir(os.path.join(self.workdir, 'OpenCV-android-sdk', 'sdk', 'java', 'javadoc'), create=True, clean=True) self.extra_packs = [] self.opencv_version = determine_opencv_version(os.path.join(self.opencvdir, "modules", "core", "include", "opencv2", "core", "version.hpp")) self.engine_version = determine_engine_version(os.path.join(self.opencvdir, "platforms", "android", "service", "engine", "AndroidManifest.xml")) @@ -168,6 +202,7 @@ class Builder: ] execute(cmd) apkdest = self.get_engine_apk_dest(engdest) + assert os.path.exists(apkdest), apkdest # Add extra data apkxmldest = check_dir(os.path.join(apkdest, "res", "xml"), create=True) apklibdest = check_dir(os.path.join(apkdest, "libs", abi.name), create=True) @@ -194,7 +229,7 @@ class Builder: # TODO: Sign apk def build_javadoc(self): - classpaths = [os.path.join(self.libdest, "bin", "classes")] + classpaths = [] for dir, _, files in os.walk(os.environ["ANDROID_SDK"]): for f in files: if f == "android.jar" or f == "annotations.jar": @@ -205,37 +240,42 @@ class Builder: "-nodeprecated", "-footer", 'OpenCV %s Documentation' % self.opencv_version, "-public", - "-sourcepath", os.path.join(self.libdest, "src"), + '-sourcepath', os.path.join(self.resultdest, 'sdk', 'java', 'src'), "-d", self.docdest, - "-classpath", ":".join(classpaths) + "-classpath", ":".join(classpaths), + '-subpackages', 'org.opencv', ] - for _, dirs, _ in os.walk(os.path.join(self.libdest, "src", "org", "opencv")): - cmd.extend(["org.opencv." + d for d in dirs]) execute(cmd) def gather_results(self, engines): # Copy all files root = os.path.join(self.libdest, "install") for item in os.listdir(root): - name = item - item = os.path.join(root, item) - if os.path.isdir(item): + src = os.path.join(root, item) + dst = os.path.join(self.resultdest, item) + if os.path.isdir(src): log.info("Copy dir: %s", item) - shutil.copytree(item, os.path.join(self.resultdest, name)) - elif os.path.isfile(item): + if self.config.force_copy: + copytree_smart(src, dst) + else: + move_smart(src, dst) + elif os.path.isfile(src): log.info("Copy file: %s", item) - shutil.copy2(item, os.path.join(self.resultdest, name)) + if self.config.force_copy: + shutil.copy2(src, dst) + else: + shutil.move(src, dst) # Copy engines for all platforms for abi, engdest in engines: log.info("Copy engine: %s (%s)", abi, engdest) f = os.path.join(self.get_engine_apk_dest(engdest), "bin", "opencv_engine-debug.apk") resname = "OpenCV_%s_Manager_%s_%s.apk" % (self.opencv_version, self.engine_version, abi) - shutil.copy2(f, os.path.join(self.resultdest, "apk", resname)) - - # Copy javadoc - log.info("Copy docs: %s", self.docdest) - shutil.copytree(self.docdest, os.path.join(self.resultdest, "sdk", "java", "javadoc")) + dst = os.path.join(self.resultdest, "apk", resname) + if self.config.force_copy: + shutil.copy2(f, dst) + else: + shutil.move(f, dst) # Clean samples path = os.path.join(self.resultdest, "samples") @@ -259,6 +299,7 @@ if __name__ == "__main__": parser.add_argument('--build_doc', action="store_true", help="Build javadoc") parser.add_argument('--no_ccache', action="store_true", help="Do not use ccache during library build") parser.add_argument('--extra_pack', action='append', help="provide extra OpenCV libraries for Manager apk in form :, for example '2.4.11:unpacked/sdk/native/libs'") + parser.add_argument('--force_copy', action="store_true", help="Do not use file move during library build (useful for debug)") args = parser.parse_args() log.basicConfig(format='%(message)s', level=log.DEBUG) @@ -272,7 +313,7 @@ if __name__ == "__main__": log.info("Android NDK path: %s", os.environ["ANDROID_NDK"]) log.info("Android SDK path: %s", os.environ["ANDROID_SDK"]) - builder = Builder(args.work_dir, args.opencv_dir) + builder = Builder(args.work_dir, args.opencv_dir, args) if args.extra_modules_path is not None: builder.extra_modules_path = os.path.abspath(args.extra_modules_path) @@ -312,11 +353,11 @@ if __name__ == "__main__": builder.build_engine(abi, engdest) engines.append((abi.name, engdest)) + builder.gather_results(engines) + if args.build_doc: builder.build_javadoc() - builder.gather_results(engines) - log.info("=====") log.info("===== Build finished") log.info("=====") diff --git a/platforms/android/service/engine/src/org/opencv/engine/OpenCVEngineService.java b/platforms/android/service/engine/src/org/opencv/engine/OpenCVEngineService.java index f2a0a521f2..bb685b2072 100644 --- a/platforms/android/service/engine/src/org/opencv/engine/OpenCVEngineService.java +++ b/platforms/android/service/engine/src/org/opencv/engine/OpenCVEngineService.java @@ -88,7 +88,7 @@ public class OpenCVEngineService extends Service { public void onCreate() { Log.d(TAG, "Service starting"); - for (Field field : R.xml.class.getDeclaredFields()) { + for (Field field : R.xml.class.getDeclaredFields()) { // Build error here means that all config.xml files are missing (configuration problem) Log.d(TAG, "Found config: " + field.getName()); final LibVariant lib = new LibVariant(); try {