Path: blob/master/platforms/android/build-tests/test_ndk_build.py
16337 views
#!/usr/bin/env python12import unittest3import os, sys, subprocess, argparse, shutil, re45TEMPLATE_ANDROID_MK = '''\6LOCAL_PATH := $(call my-dir)7include $(CLEAR_VARS)8{cut}9LOCAL_MODULE := mixed_sample10LOCAL_SRC_FILES := {cpp1}11LOCAL_LDLIBS += -llog -ldl12include $(BUILD_SHARED_LIBRARY)13include $(CLEAR_VARS)14{cut}15LOCAL_MODULE := mixed_sample216LOCAL_SRC_FILES := {cpp2}17LOCAL_LDLIBS += -llog -ldl18LOCAL_SHARED_LIBS := mixed_sample19include $(BUILD_SHARED_LIBRARY)20'''2122TEMPLATE_APPLICATION_MK = '''\23APP_STL := gnustl_static24APP_CPPFLAGS := -frtti -fexceptions -std=c++1125APP_ABI := {abi}26APP_PLATFORM := android-927'''2829TEMPLATE_JNI = '''\30#include <jni.h>31#include <opencv2/core.hpp>32#include <opencv2/imgproc.hpp>33#include <opencv2/features2d.hpp>34#include <vector>35using namespace std;36using namespace cv;37extern "C" {38JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);39JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)40{41Mat& mGr = *(Mat*)addrGray;42Mat& mRgb = *(Mat*)addrRgba;43vector<KeyPoint> v;44Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(50);45detector->detect(mGr, v);46for( unsigned int i = 0; i < v.size(); i++ )47{48const KeyPoint& kp = v[i];49circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));50}51}52}53'''5455#===================================================================================================5657class TestNDKBuild(unittest.TestCase):58def __init__(self, abi, libtype, opencv_mk_path, workdir, *args, **kwargs):59unittest.TestCase.__init__(self, *args, **kwargs)60self.abi = abi # official NDK ABI name or 'all'61self.libtype = libtype # 'static', etc62self.opencv_mk_path = opencv_mk_path63self.workdir = workdir64self.jnidir = os.path.join(self.workdir, "jni")65self.cpp1 = "jni_part1.cpp"66self.cpp2 = "jni_part2.cpp"6768def shortDescription(self):69return "ABI: %s, LIBTYPE: %s" % (self.abi, self.libtype)7071def gen_android_mk(self):72p = []73if self.libtype == "static":74p.append("OPENCV_LIB_TYPE := STATIC")75elif self.libtype == "shared":76p.append("OPENCV_LIB_TYPE := SHARED")77p.append("OPENCV_INSTALL_MODULES:=on")78elif self.libtype == "shared_opencv_manager":79p.append("OPENCV_LIB_TYPE := SHARED")80p.append("OPENCV_INSTALL_MODULES:=off")81p.append("include %s" % os.path.join(self.opencv_mk_path, "OpenCV.mk"))82return TEMPLATE_ANDROID_MK.format(cut = "\n".join(p), cpp1 = self.cpp1, cpp2 = self.cpp2)8384def gen_jni_code(self):85return TEMPLATE_JNI8687def gen_application_mk(self):88return TEMPLATE_APPLICATION_MK.format(abi = self.abi)8990def write_jni_file(self, fname, contents):91with open(os.path.join(self.jnidir, fname), "w") as f:92f.write(contents)9394def setUp(self):95if os.path.exists(self.workdir):96shutil.rmtree(self.workdir)97os.mkdir(self.workdir)98os.mkdir(self.jnidir)99self.write_jni_file("Android.mk", self.gen_android_mk())100self.write_jni_file("Application.mk", self.gen_application_mk())101self.write_jni_file(self.cpp1, self.gen_jni_code())102self.write_jni_file(self.cpp2, self.gen_jni_code())103os.chdir(self.workdir)104105def tearDown(self):106if os.path.exists(self.workdir):107shutil.rmtree(self.workdir)108109def runTest(self):110ndk_path = os.environ["ANDROID_NDK"]111retcode = subprocess.call([os.path.join(ndk_path, 'ndk-build'), "V=0"])112self.assertEqual(retcode, 0)113114def suite(workdir, opencv_mk_path):115abis = ["armeabi", "armeabi-v7a", "x86", "mips"]116ndk_path = os.environ["ANDROID_NDK"]117if os.path.exists(os.path.join(ndk_path, "RELEASE.TXT")):118with open(os.path.join(ndk_path, "RELEASE.TXT"), "r") as f:119s = f.read()120if re.search(r'r10[b-e]', s):121abis.extend(["arm64-v8a", "x86_64"])122if os.path.exists(os.path.join(ndk_path, "source.properties")): # Android NDK 11+123abis.extend(["arm64-v8a", "x86_64"])124abis.append("all")125126suite = unittest.TestSuite()127for libtype in ["static", "shared", "shared_opencv_manager"]:128for abi in abis:129suite.addTest(TestNDKBuild(abi, libtype, opencv_mk_path, workdir))130return suite131132if __name__ == '__main__':133parser = argparse.ArgumentParser(description='Test OpenCV for Android SDK with NDK')134parser.add_argument('--ndk_path', help="Path to Android NDK to use for build")135parser.add_argument("--workdir", default="testspace", help="Working directory (and output)")136parser.add_argument("opencv_mk_path", help="Path to folder with OpenCV.mk file (usually <SDK>/sdk/native/jni/")137138args = parser.parse_args()139140if args.ndk_path is not None:141os.environ["ANDROID_NDK"] = os.path.abspath(args.ndk_path)142143print("Using NDK: %s" % os.environ["ANDROID_NDK"])144145res = unittest.TextTestRunner(verbosity=3).run(suite(os.path.abspath(args.workdir), os.path.abspath(args.opencv_mk_path)))146if not res.wasSuccessful():147sys.exit(res)148149150