Skip to content

Commit

Permalink
Add android script.
Browse files Browse the repository at this point in the history
  • Loading branch information
James Chen committed May 30, 2013
1 parent 0615f48 commit f77b8b6
Show file tree
Hide file tree
Showing 13 changed files with 2,271 additions and 0 deletions.
1,746 changes: 1,746 additions & 0 deletions android/android.toolchain.cmake

Large diffs are not rendered by default.

228 changes: 228 additions & 0 deletions android/scripts/ABI_compat_generator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
#!/usr/bin/python

from optparse import OptionParser
from shutil import rmtree
import os


architecture = 'armeabi'
excludedHeaders = set(['hdf5.h', 'cap_ios.h',
'eigen.hpp', 'cxeigen.hpp' #TOREMOVE
])
systemIncludes = ['sources/cxx-stl/gnu-libstdc++/4.6/include', \
'/opt/android-ndk-r8c/platforms/android-8/arch-arm', # TODO: check if this one could be passed as command line arg
'sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include']
targetLibs = ['libopencv_java.so']
preamble = ['Eigen/Core']
# TODO: get gcc_options automatically
gcc_options = ['-fexceptions', '-frtti', '-Wno-psabi', '--sysroot=/opt/android-ndk-r8c/platforms/android-8/arch-arm', '-fpic', '-D__ARM_ARCH_5__', '-D__ARM_ARCH_5T__', '-D__ARM_ARCH_5E__', '-D__ARM_ARCH_5TE__', '-fsigned-char', '-march=armv5te', '-mtune=xscale', '-msoft-float', '-fdata-sections', '-ffunction-sections', '-Wa,--noexecstack ', '-W', '-Wall', '-Werror=return-type', '-Werror=address', '-Werror=sequence-point', '-Wformat', '-Werror=format-security', '-Wmissing-declarations', '-Wundef', '-Winit-self', '-Wpointer-arith', '-Wshadow', '-Wsign-promo', '-Wno-narrowing', '-fdiagnostics-show-option', '-fomit-frame-pointer', '-mthumb', '-fomit-frame-pointer', '-O3', '-DNDEBUG ', '-DNDEBUG']
excludedOptionsPrefix = '-W'



def GetHeaderFiles(root):
headers = []
for path in os.listdir(root):
if not os.path.isdir(os.path.join(root, path)) \
and os.path.splitext(path)[1] in ['.h', '.hpp'] \
and not path in excludedHeaders:
headers.append(os.path.join(root, path))
return sorted(headers)



def GetClasses(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 += GetClasses(currentPath, prefix + path)
else:
name = str.split(path, '.')[0]
ext = str.split(path, '.')[1]
if (ext == 'class'):
classes.append(prefix + name)
return classes



def GetJavaHHeaders():
print('\nGenerating JNI headers for Java API ...')

javahHeaders = os.path.join(managerDir, 'javah_generated_headers')
if os.path.exists(javahHeaders):
rmtree(javahHeaders)
os.makedirs(os.path.join(os.getcwd(), javahHeaders))

AndroidJavaDeps = os.path.join(SDK_path, 'platforms/android-11/android.jar')

classPath = os.path.join(managerDir, 'sdk/java/bin/classes')
if not os.path.exists(classPath):
print('Error: no Java classes found in \'%s\'' % classPath)
quit()

allJavaClasses = GetClasses(classPath, '')
if not allJavaClasses:
print('Error: no Java classes found')
quit()

for currentClass in allJavaClasses:
os.system('javah -d %s -classpath %s:%s %s' % (javahHeaders, classPath, \
AndroidJavaDeps, currentClass))

print('\nBuilding JNI headers list ...')
jniHeaders = GetHeaderFiles(javahHeaders)

return jniHeaders



def GetImmediateSubdirs(dir):
return [name for name in os.listdir(dir)
if os.path.isdir(os.path.join(dir, name))]



def GetOpenCVModules():
makefile = open(os.path.join(managerDir, 'sdk/native/jni/OpenCV.mk'), 'r')
makefileStr = makefile.read()
left = makefileStr.find('OPENCV_MODULES:=') + len('OPENCV_MODULES:=')
right = makefileStr[left:].find('\n')
modules = makefileStr[left:left+right].split()
modules = filter(lambda x: x != 'ts' and x != 'androidcamera', modules)
return modules



def FindHeaders():
headers = []

print('\nBuilding Native OpenCV header list ...')

cppHeadersFolder = os.path.join(managerDir, 'sdk/native/jni/include/opencv2')

modulesFolders = GetImmediateSubdirs(cppHeadersFolder)
modules = GetOpenCVModules()

cppHeaders = []
for m in modules:
for f in modulesFolders:
moduleHeaders = []
if f == m:
moduleHeaders += GetHeaderFiles(os.path.join(cppHeadersFolder, f))
if m == 'flann':
flann = os.path.join(cppHeadersFolder, f, 'flann.hpp')
moduleHeaders.remove(flann)
moduleHeaders.insert(0, flann)
cppHeaders += moduleHeaders


cppHeaders += GetHeaderFiles(cppHeadersFolder)
headers += cppHeaders

cHeaders = GetHeaderFiles(os.path.join(managerDir, \
'sdk/native/jni/include/opencv'))
headers += cHeaders

headers += GetJavaHHeaders()

return headers



def FindLibraries():
libraries = []
for lib in targetLibs:
libraries.append(os.path.join(managerDir, 'sdk/native/libs', architecture, lib))
return libraries



def FindIncludes():
includes = [os.path.join(managerDir, 'sdk', 'native', 'jni', 'include'),
os.path.join(managerDir, 'sdk', 'native', 'jni', 'include', 'opencv'),
os.path.join(managerDir, 'sdk', 'native', 'jni', 'include', 'opencv2')]

for inc in systemIncludes:
includes.append(os.path.join(NDK_path, inc))

return includes



def FilterGCCOptions():
gcc = filter(lambda x: not x.startswith(excludedOptionsPrefix), gcc_options)
return sorted(gcc)



def WriteXml(version, headers, includes, libraries):
xmlName = version + '.xml'

print '\noutput file: ' + xmlName
try:
xml = open(xmlName, 'w')
except:
print 'Error: Cannot open output file "%s" for writing' % xmlName
quit()

xml.write('<descriptor>')

xml.write('\n\n<version>')
xml.write('\n\t%s' % version)
xml.write('\n</version>')

xml.write('\n\n<headers>')
xml.write('\n\t%s' % '\n\t'.join(headers))
xml.write('\n</headers>')

xml.write('\n\n<include_paths>')
xml.write('\n\t%s' % '\n\t'.join(includes))
xml.write('\n</include_paths>')

# TODO: uncomment when Eigen problem is solved
# xml.write('\n\n<include_preamble>')
# xml.write('\n\t%s' % '\n\t'.join(preamble))
# xml.write('\n</include_preamble>')

xml.write('\n\n<libs>')
xml.write('\n\t%s' % '\n\t'.join(libraries))
xml.write('\n</libs>')

xml.write('\n\n<gcc_options>')
xml.write('\n\t%s' % '\n\t'.join(gcc_options))
xml.write('\n</gcc_options>')

xml.write('\n\n</descriptor>')



if __name__ == '__main__':
usage = '%prog <OpenCV_Manager install directory> <OpenCV_Manager version>'
parser = OptionParser(usage = usage)

args = parser.parse_args()
if 2 != len(args):
parser.print_help()
quit()

managerDir = args[1][0]
version = args[1][1]

NDK_path = '/opt/android-ndk-r8c'
print '\nUsing Android NDK from "%s"' % NDK_path

SDK_path = '~/NVPACK/android-sdk-linux'
print '\nUsing Android SDK from "%s"' % SDK_path

headers = FindHeaders()

includes = FindIncludes()

libraries = FindLibraries()

gcc_options = FilterGCCOptions()

WriteXml(version, headers, includes, libraries)
90 changes: 90 additions & 0 deletions android/scripts/build.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
@ECHO OFF

:: enable command extensions
VERIFY BADVALUE 2>NUL
SETLOCAL ENABLEEXTENSIONS || (ECHO Unable to enable command extensions. & EXIT \B)

:: build environment
SET SOURCE_DIR=%cd%
IF EXIST .\android.toolchain.cmake (SET BUILD_OPENCV=1) ELSE (SET BUILD_OPENCV=0)
IF EXIST .\jni\nul (SET BUILD_JAVA_PART=1) ELSE (SET BUILD_JAVA_PART=0)

:: load configuration
PUSHD %~dp0
SET SCRIPTS_DIR=%cd%
IF EXIST .\wincfg.cmd CALL .\wincfg.cmd
POPD

:: inherit old names
IF NOT DEFINED CMAKE SET CMAKE=%CMAKE_EXE%
IF NOT DEFINED MAKE SET MAKE=%MAKE_EXE%

:: defaults
IF NOT DEFINED BUILD_DIR SET BUILD_DIR=build
IF NOT DEFINED ANDROID_ABI SET ANDROID_ABI=armeabi-v7a
SET OPENCV_BUILD_DIR=%SCRIPTS_DIR%\..\%BUILD_DIR%

:: check that all required variables defined
PUSHD .
IF NOT DEFINED ANDROID_NDK (ECHO. & ECHO You should set an environment variable ANDROID_NDK to the full path to your copy of Android NDK & GOTO end)
(CD "%ANDROID_NDK%") || (ECHO. & ECHO Directory "%ANDROID_NDK%" specified by ANDROID_NDK variable does not exist & GOTO end)

IF NOT EXIST "%CMAKE%" (ECHO. & ECHO You should set an environment variable CMAKE to the full path to cmake executable & GOTO end)
IF NOT EXIST "%MAKE%" (ECHO. & ECHO You should set an environment variable MAKE to the full path to native port of make executable & GOTO end)

IF NOT %BUILD_JAVA_PART%==1 GOTO required_variables_checked

IF NOT DEFINED ANDROID_SDK (ECHO. & ECHO You should set an environment variable ANDROID_SDK to the full path to your copy of Android SDK & GOTO end)
(CD "%ANDROID_SDK%" 2>NUL) || (ECHO. & ECHO Directory "%ANDROID_SDK%" specified by ANDROID_SDK variable does not exist & GOTO end)

IF NOT DEFINED ANT_DIR (ECHO. & ECHO You should set an environment variable ANT_DIR to the full path to Apache Ant root & GOTO end)
(CD "%ANT_DIR%" 2>NUL) || (ECHO. & ECHO Directory "%ANT_DIR%" specified by ANT_DIR variable does not exist & GOTO end)

IF NOT DEFINED JAVA_HOME (ECHO. & ECHO You should set an environment variable JAVA_HOME to the full path to JDK & GOTO end)
(CD "%JAVA_HOME%" 2>NUL) || (ECHO. & ECHO Directory "%JAVA_HOME%" specified by JAVA_HOME variable does not exist & GOTO end)

:required_variables_checked
POPD

:: check for ninja
echo "%MAKE%"|findstr /i ninja >nul:
IF %errorlevel%==1 (SET BUILD_WITH_NINJA=0) ELSE (SET BUILD_WITH_NINJA=1)
IF %BUILD_WITH_NINJA%==1 (SET CMAKE_GENERATOR=Ninja) ELSE (SET CMAKE_GENERATOR=MinGW Makefiles)

:: create build dir
IF DEFINED REBUILD rmdir /S /Q "%BUILD_DIR%" 2>NUL
MKDIR "%BUILD_DIR%" 2>NUL
PUSHD "%BUILD_DIR%" || (ECHO. & ECHO Directory "%BUILD_DIR%" is not found & GOTO end)

:: run cmake
ECHO. & ECHO Runnning cmake...
ECHO ANDROID_ABI=%ANDROID_ABI%
ECHO.
IF NOT %BUILD_OPENCV%==1 GOTO other-cmake
:opencv-cmake
("%CMAKE%" -G"%CMAKE_GENERATOR%" -DANDROID_ABI="%ANDROID_ABI%" -DCMAKE_TOOLCHAIN_FILE="%SOURCE_DIR%"\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM="%MAKE%" %* "%SOURCE_DIR%\..") && GOTO cmakefin
ECHO. & ECHO cmake failed & GOTO end
:other-cmake
("%CMAKE%" -G"%CMAKE_GENERATOR%" -DANDROID_ABI="%ANDROID_ABI%" -DOpenCV_DIR="%OPENCV_BUILD_DIR%" -DCMAKE_TOOLCHAIN_FILE="%OPENCV_BUILD_DIR%\..\android.toolchain.cmake" -DCMAKE_MAKE_PROGRAM="%MAKE%" %* "%SOURCE_DIR%") && GOTO cmakefin
ECHO. & ECHO cmake failed & GOTO end
:cmakefin

:: run make
ECHO. & ECHO Building native libs...
IF %BUILD_WITH_NINJA%==0 ("%MAKE%" -j %NUMBER_OF_PROCESSORS% VERBOSE=%VERBOSE%) || (ECHO. & ECHO make failed & GOTO end)
IF %BUILD_WITH_NINJA%==1 ("%MAKE%") || (ECHO. & ECHO ninja failed & GOTO end)

IF NOT %BUILD_JAVA_PART%==1 GOTO end
POPD && PUSHD %SOURCE_DIR%

:: configure java part
ECHO. & ECHO Updating Android project...
(CALL "%ANDROID_SDK%\tools\android" update project --name %PROJECT_NAME% --path .) || (ECHO. & ECHO failed to update android project & GOTO end)

:: compile java part
ECHO. & ECHO Compiling Android project...
(CALL "%ANT_DIR%\bin\ant" debug) || (ECHO. & ECHO failed to compile android project & GOTO end)

:end
POPD
ENDLOCAL
23 changes: 23 additions & 0 deletions android/scripts/camera_build.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# make target; arch; API level; Android Source Code Root
native_camera_r2.2.0; armeabi; 8; $ANDROID_STUB_ROOT/2.2.2
native_camera_r2.2.0; armeabi-v7a; 8; $ANDROID_STUB_ROOT/2.2.2
native_camera_r2.3.3; armeabi; 9; $ANDROID_STUB_ROOT/2.3.3
native_camera_r2.3.3; armeabi-v7a; 9; $ANDROID_STUB_ROOT/2.3.3
native_camera_r2.3.3; x86; 9; $ANDROID_STUB_ROOT/2.3.3
native_camera_r3.0.1; armeabi; 9; $ANDROID_STUB_ROOT/3.0.1
native_camera_r3.0.1; armeabi-v7a; 9; $ANDROID_STUB_ROOT/3.0.1
native_camera_r3.0.1; x86; 9; $ANDROID_STUB_ROOT/3.0.1
native_camera_r4.0.3; armeabi; 14; $ANDROID_STUB_ROOT/4.0.3
native_camera_r4.0.3; armeabi-v7a; 14; $ANDROID_STUB_ROOT/4.0.3
native_camera_r4.0.3; x86; 14; $ANDROID_STUB_ROOT/4.0.3
native_camera_r4.0.3; mips; 14; $ANDROID_STUB_ROOT/4.0.3_mips
native_camera_r4.0.0; armeabi; 14; $ANDROID_STUB_ROOT/4.0.0
native_camera_r4.0.0; armeabi-v7a; 14; $ANDROID_STUB_ROOT/4.0.0
native_camera_r4.1.1; armeabi; 14; $ANDROID_STUB_ROOT/4.1.1
native_camera_r4.1.1; armeabi-v7a; 14; $ANDROID_STUB_ROOT/4.1.1
native_camera_r4.1.1; x86; 14; $ANDROID_STUB_ROOT/4.1.1
native_camera_r4.1.1; mips; 14; $ANDROID_STUB_ROOT/4.1.1
native_camera_r4.2.0; armeabi-v7a; 14; $ANDROID_STUB_ROOT/4.2.0
native_camera_r4.2.0; armeabi; 14; $ANDROID_STUB_ROOT/4.2.0
native_camera_r4.2.0; x86; 14; $ANDROID_STUB_ROOT/4.2.0
native_camera_r4.2.0; mips; 14; $ANDROID_STUB_ROOT/4.2.0
5 changes: 5 additions & 0 deletions android/scripts/cmake_android.cmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@ECHO OFF

PUSHD %~dp0..
CALL .\scripts\build.cmd %* -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
POPD
8 changes: 8 additions & 0 deletions android/scripts/cmake_android.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/sh
cd `dirname $0`/..

mkdir -p build
cd build

cmake -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DCMAKE_TOOLCHAIN_FILE=../android.toolchain.cmake $@ ../..

Loading

0 comments on commit f77b8b6

Please sign in to comment.