使用Java绑定交叉编译OpenCV for Rpi2

时间:2016-01-04 19:17:01

标签: opencv gcc arm raspberry-pi cross-compiling

我尝试做的是将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)

0 个答案:

没有答案