Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/platforms/android/build-tests/test_ndk_build.py
16337 views
1
#!/usr/bin/env python
2
3
import unittest
4
import os, sys, subprocess, argparse, shutil, re
5
6
TEMPLATE_ANDROID_MK = '''\
7
LOCAL_PATH := $(call my-dir)
8
include $(CLEAR_VARS)
9
{cut}
10
LOCAL_MODULE := mixed_sample
11
LOCAL_SRC_FILES := {cpp1}
12
LOCAL_LDLIBS += -llog -ldl
13
include $(BUILD_SHARED_LIBRARY)
14
include $(CLEAR_VARS)
15
{cut}
16
LOCAL_MODULE := mixed_sample2
17
LOCAL_SRC_FILES := {cpp2}
18
LOCAL_LDLIBS += -llog -ldl
19
LOCAL_SHARED_LIBS := mixed_sample
20
include $(BUILD_SHARED_LIBRARY)
21
'''
22
23
TEMPLATE_APPLICATION_MK = '''\
24
APP_STL := gnustl_static
25
APP_CPPFLAGS := -frtti -fexceptions -std=c++11
26
APP_ABI := {abi}
27
APP_PLATFORM := android-9
28
'''
29
30
TEMPLATE_JNI = '''\
31
#include <jni.h>
32
#include <opencv2/core.hpp>
33
#include <opencv2/imgproc.hpp>
34
#include <opencv2/features2d.hpp>
35
#include <vector>
36
using namespace std;
37
using namespace cv;
38
extern "C" {
39
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);
40
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial4_Sample4Mixed_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)
41
{
42
Mat& mGr = *(Mat*)addrGray;
43
Mat& mRgb = *(Mat*)addrRgba;
44
vector<KeyPoint> v;
45
Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(50);
46
detector->detect(mGr, v);
47
for( unsigned int i = 0; i < v.size(); i++ )
48
{
49
const KeyPoint& kp = v[i];
50
circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));
51
}
52
}
53
}
54
'''
55
56
#===================================================================================================
57
58
class TestNDKBuild(unittest.TestCase):
59
def __init__(self, abi, libtype, opencv_mk_path, workdir, *args, **kwargs):
60
unittest.TestCase.__init__(self, *args, **kwargs)
61
self.abi = abi # official NDK ABI name or 'all'
62
self.libtype = libtype # 'static', etc
63
self.opencv_mk_path = opencv_mk_path
64
self.workdir = workdir
65
self.jnidir = os.path.join(self.workdir, "jni")
66
self.cpp1 = "jni_part1.cpp"
67
self.cpp2 = "jni_part2.cpp"
68
69
def shortDescription(self):
70
return "ABI: %s, LIBTYPE: %s" % (self.abi, self.libtype)
71
72
def gen_android_mk(self):
73
p = []
74
if self.libtype == "static":
75
p.append("OPENCV_LIB_TYPE := STATIC")
76
elif self.libtype == "shared":
77
p.append("OPENCV_LIB_TYPE := SHARED")
78
p.append("OPENCV_INSTALL_MODULES:=on")
79
elif self.libtype == "shared_opencv_manager":
80
p.append("OPENCV_LIB_TYPE := SHARED")
81
p.append("OPENCV_INSTALL_MODULES:=off")
82
p.append("include %s" % os.path.join(self.opencv_mk_path, "OpenCV.mk"))
83
return TEMPLATE_ANDROID_MK.format(cut = "\n".join(p), cpp1 = self.cpp1, cpp2 = self.cpp2)
84
85
def gen_jni_code(self):
86
return TEMPLATE_JNI
87
88
def gen_application_mk(self):
89
return TEMPLATE_APPLICATION_MK.format(abi = self.abi)
90
91
def write_jni_file(self, fname, contents):
92
with open(os.path.join(self.jnidir, fname), "w") as f:
93
f.write(contents)
94
95
def setUp(self):
96
if os.path.exists(self.workdir):
97
shutil.rmtree(self.workdir)
98
os.mkdir(self.workdir)
99
os.mkdir(self.jnidir)
100
self.write_jni_file("Android.mk", self.gen_android_mk())
101
self.write_jni_file("Application.mk", self.gen_application_mk())
102
self.write_jni_file(self.cpp1, self.gen_jni_code())
103
self.write_jni_file(self.cpp2, self.gen_jni_code())
104
os.chdir(self.workdir)
105
106
def tearDown(self):
107
if os.path.exists(self.workdir):
108
shutil.rmtree(self.workdir)
109
110
def runTest(self):
111
ndk_path = os.environ["ANDROID_NDK"]
112
retcode = subprocess.call([os.path.join(ndk_path, 'ndk-build'), "V=0"])
113
self.assertEqual(retcode, 0)
114
115
def suite(workdir, opencv_mk_path):
116
abis = ["armeabi", "armeabi-v7a", "x86", "mips"]
117
ndk_path = os.environ["ANDROID_NDK"]
118
if os.path.exists(os.path.join(ndk_path, "RELEASE.TXT")):
119
with open(os.path.join(ndk_path, "RELEASE.TXT"), "r") as f:
120
s = f.read()
121
if re.search(r'r10[b-e]', s):
122
abis.extend(["arm64-v8a", "x86_64"])
123
if os.path.exists(os.path.join(ndk_path, "source.properties")): # Android NDK 11+
124
abis.extend(["arm64-v8a", "x86_64"])
125
abis.append("all")
126
127
suite = unittest.TestSuite()
128
for libtype in ["static", "shared", "shared_opencv_manager"]:
129
for abi in abis:
130
suite.addTest(TestNDKBuild(abi, libtype, opencv_mk_path, workdir))
131
return suite
132
133
if __name__ == '__main__':
134
parser = argparse.ArgumentParser(description='Test OpenCV for Android SDK with NDK')
135
parser.add_argument('--ndk_path', help="Path to Android NDK to use for build")
136
parser.add_argument("--workdir", default="testspace", help="Working directory (and output)")
137
parser.add_argument("opencv_mk_path", help="Path to folder with OpenCV.mk file (usually <SDK>/sdk/native/jni/")
138
139
args = parser.parse_args()
140
141
if args.ndk_path is not None:
142
os.environ["ANDROID_NDK"] = os.path.abspath(args.ndk_path)
143
144
print("Using NDK: %s" % os.environ["ANDROID_NDK"])
145
146
res = unittest.TextTestRunner(verbosity=3).run(suite(os.path.abspath(args.workdir), os.path.abspath(args.opencv_mk_path)))
147
if not res.wasSuccessful():
148
sys.exit(res)
149
150