#!/usr/bin/python import os import sys ANDROID_SDK_PATH = "/opt/android-sdk-linux" ANDROID_NDK_PATH = None INSTALL_DIRECTORY = None CLASS_PATH = None TMP_HEADER_PATH="tmp_include" HEADER_EXTS = set(['h', 'hpp']) SYS_INCLUDES = ["platforms/android-8/arch-arm/usr/include", "sources/cxx-stl/gnu-libstdc++/include", "sources/cxx-stl/gnu-libstdc++/libs/armeabi/include"] PROJECT_NAME = "OpenCV-branch" TARGET_LIBS = ["libopencv_java.so"] ARCH = "armeabi" GCC_OPTIONS = "-fpermissive" EXCLUDE_HEADERS = set(["hdf5.h", "eigen.hpp", "cxeigen.hpp"]); def FindClasses(root, prefix): classes = [] if ("" != prefix): prefix = prefix + "." for path in os.listdir(root): currentPath = os.path.join(root, path) if (os.path.isdir(currentPath)): classes += FindClasses(currentPath, prefix + path) else: name = str.split(path, ".")[0] ext = str.split(path, ".")[1] if (ext == "class"): #print("class: %s" % (prefix + name)) classes.append(prefix+name) return classes def FindHeaders(root): headers = [] for path in os.listdir(root): currentPath = os.path.join(root, path) if (os.path.isdir(currentPath)): headers += FindHeaders(currentPath) else: ext = str.split(path, ".")[-1] #print("%s: \"%s\"" % (currentPath, ext)) if (ext in HEADER_EXTS): #print("Added as header file") if (path not in EXCLUDE_HEADERS): headers.append(currentPath) return headers if (len(sys.argv) < 3): print("Error: Invalid command line arguments") exit(-1) INSTALL_DIRECTORY = sys.argv[1] PROJECT_NAME = sys.argv[2] CLASS_PATH = os.path.join(INSTALL_DIRECTORY, "sdk/java/bin/classes") if (not os.path.exists(CLASS_PATH)): print("Error: no java classes found in \"%s\"" % CLASS_PATH) exit(-2) if (os.environ.has_key("NDK_ROOT")): ANDROID_NDK_PATH = os.environ["NDK_ROOT"]; print("Using Android NDK from NDK_ROOT (\"%s\")" % ANDROID_NDK_PATH) if (not ANDROID_NDK_PATH): pipe = os.popen("which ndk-build") tmp = str.strip(pipe.readline(), "\n") while(not tmp): tmp = str.strip(pipe.readline(), "\n") pipe.close() ANDROID_NDK_PATH = os.path.split(tmp)[0] print("Using Android NDK from PATH (\"%s\")" % ANDROID_NDK_PATH) print("Using Android SDK from \"%s\"" % ANDROID_SDK_PATH) outputFileName = PROJECT_NAME + ".xml" try: outputFile = open(outputFileName, "w") except: print("Error: Cannot open output file \"%s\" for writing" % outputFileName) allJavaClasses = FindClasses(CLASS_PATH, "") if (not allJavaClasses): print("Error: No Java classes found :(") exit(-1) if (not os.path.exists(TMP_HEADER_PATH)): os.makedirs(os.path.join(os.getcwd(), TMP_HEADER_PATH)) print("Generating JNI headers for Java API ...") AndroidJavaDeps = os.path.join(ANDROID_SDK_PATH, "platforms/android-11/android.jar") for currentClass in allJavaClasses: os.system("javah -d %s -classpath %s:%s %s" % (TMP_HEADER_PATH, CLASS_PATH, AndroidJavaDeps, currentClass)) print("Building JNI headers list ...") jniHeaders = FindHeaders(TMP_HEADER_PATH) #print(jniHeaders) print("Building Native OpenCV header list ...") cHeaders = FindHeaders(os.path.join(INSTALL_DIRECTORY, "sdk/native/jni/include/opencv")) cppHeaders = FindHeaders(os.path.join(INSTALL_DIRECTORY, "sdk/native/jni/include/opencv2")) #print(cHeaders) #print(cppHeaders) print("Writing config file ...") outputFile.write("\n\n\n\t%s\n\n\n\n" % PROJECT_NAME) outputFile.write("\t" + "\n\t".join(cHeaders)) outputFile.write("\n\t" + "\n\t".join(cppHeaders)) outputFile.write("\n\t" + "\n\t".join(jniHeaders)) outputFile.write("\n\n\n") includes = [os.path.join(INSTALL_DIRECTORY, "sdk", "native", "jni", "include"), os.path.join(INSTALL_DIRECTORY, "sdk", "native", "jni", "include", "opencv"), os.path.join(INSTALL_DIRECTORY, "sdk", "native", "jni", "include", "opencv2")] for inc in SYS_INCLUDES: includes.append(os.path.join(ANDROID_NDK_PATH, inc)) outputFile.write("\n\t%s\n\n\n" % "\n\t".join(includes)) libraries = [] for lib in TARGET_LIBS: libraries.append(os.path.join(INSTALL_DIRECTORY, "sdk/native/libs", ARCH, lib)) outputFile.write("\n\t%s\n\n\n" % "\n\t".join(libraries)) outputFile.write("\n\t%s\n\n\n" % GCC_OPTIONS) print("done!")