Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
f9cf70e9
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f9cf70e9
编写于
2月 06, 2013
作者:
A
Anna Kogan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Updated script for ABI compliance check
上级
f608df96
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
218 addition
and
120 deletion
+218
-120
android/scripts/ABI_compat_generator.py
android/scripts/ABI_compat_generator.py
+218
-120
未找到文件。
android/scripts/ABI_compat_generator.py
浏览文件 @
f9cf70e9
#!/usr/bin/python
from
optparse
import
OptionParser
from
shutil
import
rmtree
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
):
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
+
"."
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
)
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
FindHeaders
(
root
):
def
GetJavaHHeaders
():
print
(
'
\n
Generating 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
(
'
\n
Building 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
=
[]
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
)
print
(
'
\n
Building 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
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
(
"<descriptor>
\n\n
<version>
\n\t
%s
\n
</version>
\n\n
<headers>
\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
</headers>
\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
(
"<include_paths>
\n\t
%s
\n
</include_paths>
\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
(
"<libs>
\n\t
%s
\n
</libs>
\n\n
"
%
"
\n\t
"
.
join
(
libraries
))
outputFile
.
write
(
"<gcc_options>
\n\t
%s
\n
</gcc_options>
\n\n
</descriptor>"
%
GCC_OPTIONS
)
print
(
"done!"
)
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
'
\n
output 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
'
\n
Using Android NDK from "%s"'
%
NDK_path
SDK_path
=
'~/NVPACK/android-sdk-linux'
print
'
\n
Using Android SDK from "%s"'
%
SDK_path
headers
=
FindHeaders
()
includes
=
FindIncludes
()
libraries
=
FindLibraries
()
gcc_options
=
FilterGCCOptions
()
WriteXml
(
version
,
headers
,
includes
,
libraries
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录