原链接: https://community.bwbot.org/topic/682
开发测试平台:小强机器人

在Android上运行ROS程序一般使用rosjava-android。但是也可以直接利用NDK编译成so文件移植到Android上。当然移植过程也并不简单。 下面是一个简单的例子。

安装cmake(>3.14)

新版本的cmake增加了对Android cross compile的支持,所以我们要安装新版本的cmake。

wget -q https://github.com/Kitware/CMake/releases/download/v3.14.0-rc4/cmake-3.14.0-rc4.tar.gztar -xzf cmake-3.14.0-rc4.tar.gzcd cmake-3.14.0-rc4/env CC=$(which clang) CXX=$(which clang++) ./bootstrap --prefix=/usr --parallel=4makesudo make installcd ..

安装clang

新版本的NDK默认使用clang进行编译。所以我们需要安装clang。clang的安装方式可以参照这里

安装NDK

wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zipunzip -qq android-ndk-r18b-linux-x86_64.zipexport NDK_ROOT=$(pwd)/android-ndk-r18b

设置cmake toolchain

git clone https://github.com/BluewhaleRobot/rostoolchainexport TOOLCHAIN_ROOT=$(pwd)/rostoolchain

安装Boost-android

git clone https://github.com/moritz-wundke/Boost-for-Androidmkdir boost_libscd Boost-for-Android./build-android.sh --boost=1.68.0 --prefix=$(pwd)/../boost_libs $NDK_ROOTcd ..#set up boostexport INSTALL_PREFIX=/opt/ros/armsudo mkdir -p $INSTALL_PREFIX/includesudo mkdir -p $INSTALL_PREFIX/libsudo cp -rf boost_libs/armeabi-v7a/include/boost-1_68/boost $INSTALL_PREFIX/include/sudo cp boost_libs/armeabi-v7a/lib/*.a $INSTALL_PREFIX/lib/

设置ROS workspace

mkdir -p arm/srccd arm/srcgit clone https://github.com/ros/catkin --depth=1git clone https://github.com/ros/common_msgs --depth=1git clone https://github.com/ros/gencpp --depth=1git clone https://github.com/jsk-ros-pkg/geneus --depth=1git clone https://github.com/ros/genlisp --depth=1git clone https://github.com/ros/genmsg --depth=1git clone https://github.com/RethinkRobotics-opensource/gennodejs --depth=1git clone https://github.com/ros/genpy --depth=1git clone https://github.com/ros/message_generation --depth=1git clone https://github.com/ros/message_runtime --depth=1git clone https://github.com/BluewhaleRobot/ros_comm --depth=1git clone https://github.com/ros/ros_comm_msgs --depth=1git clone https://github.com/BluewhaleRobot/rosconsole --depth=1git clone https://github.com/BluewhaleRobot/roscpp_core --depth=1git clone https://github.com/ros/std_msgs --depth=1

编译工作空间

cd .../src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFFsudo cp -rf devel/lib/*.a $INSTALL_PREFIX/lib/sudo cp -rf devel/lib/pkgconfig $INSTALL_PREFIX/lib/export PKG_CONFIG_PATH=$INSTALL_PREFIX/lib/pkgconfig

编译你自己的代码

现在把你的代码放置到此工作空间内,然后像之前编译工作空间一样。

./src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFF

编译出so文件或.a文件之后,利用JNI写一个包装程序,然后通过java调用。这样就可以在Android app里面使用了。

简单说就是利用java的工具生成c++的头文件,然后把自己的方法添加到对应的实现里面。
这是我自己移植程序的 jni wrapper

更多相关文章

  1. 修改Android中的文件权限
  2. Android录音文件在IOS上播放不出来的问题
  3. Android之A面试题③应用程序启动过程源代码分析
  4. Android应用程序启动
  5. Windows下安装Android SDK与USB驱动程序
  6. 几行代码看程序员的水平——Android文件命名规范
  7. Android — 创建文件及文件夹
  8. Android文件选择器的实例分享

随机推荐

  1. JNI 无法确定Bitmap的签名
  2. Android/Linux大于1024Bytes打印
  3. Android(安卓)SQLite使用
  4. Gradle Sync Failed,报错"could not find
  5. android 全屏实现
  6. Android(安卓)点击赞时弹出+1向上弹出动
  7. Android(安卓)Wifi相关广播 -- WIFI_STAT
  8. android中handler的使用
  9. [置顶] android 捕捉异常
  10. Android(安卓)封装http请求的工具类