我尝试做的是将OpenCV从x86主机交叉编译到带有Java绑定的ARM目标机器(Raspberry Pi 2)。 我所获得的只是为x86平台编译带有Java绑定的OpenCV,甚至是ARM平台上没有Java绑定的OpenCV。但是我无法使用ARM平台的Java绑定编译OpenCV。
我已经跟踪了成千上万的指南来做到这一点。这是来自OpenCV的官方网站,看起来非常简单:http://docs.opencv.org/2.4/doc/tutorials/introduction/crosscompilation/arm_crosscompile_with_cmake.html
我的主机如下:
$ uname -a:
Linux ubuntu 4.2.0-16-generic #19-Ubuntu SMP Thu Oct 8 14:46:51 UTC 2015 i686 i686 i686 GNU/Linux
我已经安装了gcc和g ++交叉编译工具(gnueabi和gnueabihf):
$ sudo apt-get install gcc-arm-linux-gnueabi
$ sudo apt-get install g++-arm-linux-gnueabi
$ sudo apt-get install gcc-arm-linux-gnueabihf
$ sudo apt-get install g++-arm-linux-gnueabihf
$ which arm-linux-gnueabihf-gcc
/usr/bin/arm-linux-gnueabihf-gcc
$ which arm-linux-gnueabihf-g++
/usr/bin/arm-linux-gnueabihf-g++
由于我想用Java绑定编译OpenCV,我安装了jdk和ant:
$ sudo apt-get install openjdk-7-jre
$ sudo apt-get install openjdk-7-jdk
$ sudo apt-get install ant
然后我将这些行添加到.bashrc文件中:
JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386
PATH=$JAVA_HOME/bin:$PATH
export PATH
然后我执行:
$ source $HOME/.bashrc
我已经下载了OpenCV的源代码并转移到了平台/ linux文件夹,正如官方指南所做的那样:
$ cd ~/opencv/platforms/linux
$ mkdir -p build_hardfp
$ cd build_hardfp
然后在" opencv / platforms / arm-gnueabi.toolchain.cmake"文件,替换了这些行:
set(CMAKE_C_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
set(CMAKE_CXX_COMPILER arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})
通过这些:
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)
为了使用arm编译器而不是x86' s。 然后我尝试准备好cmake:
$ cmake -DBUILD_SHARED_LIBS=OFF -D BUILD_NEW_PYTHON_SUPPORT=NO -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../..
Cmake的输出告诉它将为ARM平台目标使用arm交叉编译器,但它不会使用Java绑定:
...
-- Platform:
-- Host: Linux 4.2.0-16-generic i686
-- Target: Linux 1 arm
-- CMake: 3.2.2
-- CMake generator: Unix Makefiles
-- CMake build tool: /usr/bin/make
-- Configuration: Release
...
C++ Compiler: /usr/bin/arm-linux-gnueabihf-g++ (ver 5.2.1)
...
-- OpenCV modules:
-- To be built: core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib stitching superres ts videostab
-- Disabled: world
-- Disabled by dependency: -
-- Unavailable: androidcamera dynamicuda java python viz
所以,我尝试自己设置cmake编译变量而不使用cmake的工具链文件:
$ export CMAKE_C_COMPILER=/usr/bin/arm-linux-gnueabihf-gcc
$ export CMAKE_CXX_COMPILER=/usr/bin/arm-linux-gnueabihf-g++
$ cmake -DBUILD_SHARED_LIBS=OFF -D BUILD_NEW_PYTHON_SUPPORT=NO ../../..
现在cmake的输出告诉它将包含Java支持,但它不会使用arm交叉编译器:
...
-- Platform:
-- Host: Linux 4.2.0-16-generic i686
-- CMake: 3.2.2
-- CMake generator: Unix Makefiles
-- CMake build tool: /usr/bin/make
-- Configuration: Release
...
C++ Compiler: /usr/bin/c++ (ver 5.2.1)
...
-- OpenCV modules:
-- To be built: core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib java stitching superres ts videostab
-- Disabled: world
-- Disabled by dependency: -
-- Unavailable: androidcamera dynamicuda python viz
当然,如果我用这个最新的cmake配置执行make命令,这就是" .so"我得到的文件:
$ readelf -h lib/libopencv_java249.so | grep Machine
Machine: Intel 80386
它应该告诉:
Machine: ARM
所以,再一次:我可以用x86平台的Java绑定编译OpenCV,或者用ARM平台编译没有Java绑定的OpenCV,但不能同时编译两者。
我该怎么做?
谢谢!
更新1:
@Notlikethat我忘了告诉我已经尝试过(即使用ARM jdk而不是x86)。我没有提到它,因为我虽然应该使用x86。 但是,我再次尝试过: 我已经下载了ARM的jdk,正确设置JAVA_HOME和PATH变量以指向这个新的jdk并尝试了cmake命令。 结果是一样的,它允许我编译没有Java绑定的ARM,或者带有Java绑定的x86。
更新2:
我已将以下变量添加到" arm-gnueabi.toolchain.cmake"文件:
set(JAVA_HOME /usr/lib/jvm/jdk1.7.0_60_ARM)
set(JAVA_AWT_LIBRARY $JAVA_HOME/include/jawt.h)
set(JAVA_JVM_LIBRARY $JAVA_HOME/jre/lib/arm/jvm.cfg)
set(JAVA_INCLUDE_PATH $JAVA_HOME/include/jni.h)
set(JAVA_INCLUDE_PATH2 $JAVA_HOME/include/linux/jni_md.h)
set(JAVA_AWT_INCLUDE_PATH $JAVA_HOME/include/jawt.h)
现在如果我执行:
$ cmake -DBUILD_SHARED_LIBS=OFF -D BUILD_NEW_PYTHON_SUPPORT=NO -DCMAKE_TOOLCHAIN_FILE=../arm-gnueabi.toolchain.cmake ../../..
输出显示java模块仍然不可用,但至少,其中一个关键依赖项是可以的(JNI):
...
-- Java:
-- ant: NO
-- JNI: $JAVA_HOME/include/jni.h $JAVA_HOME/include/linux/jni_md.h $JAVA_HOME/include/jawt.h
-- Java tests: NO
...
我很确定这里的问题是找不到蚂蚁的事实,我无法理解。 安装了Ant:
$ echo $PATH:/usr/lib/jvm/jdk1.7.0_60_ARM/bin:/opt/apache/ant/apache-ant-1.9.6/bin:...
我通过将以下变量添加到" arm-gnueabi.toolchain.cmake"来重试。文件,但没有成功:
set(ANT_HOME /opt/apache/ant/apache-ant-1.9.6)
set(JAVA_ANT $ANT_HOME/bin/ant)