ros2_java jazzy対応のAndroid java用ライブラリを作る(備忘録)
以前のブログで、ros2_javaでAndroid用のライブラリを作りましたが、最新のROS2 jazzyには対応していないようで、アプリが落ちてしまう現象が発生しました。
【ROS2】ros2_javaを使って、Android用ROS2ライブラリを作成する方法
今回、jazzyに対応したros2_javaを作りましたので備忘録としてまとめておきます。
なお、ros2_java用の環境を作ってくれている方がいたので、以下の環境を使わせて頂きました。
GitHub(ros2_java)
ビルド環境について
ビルド環境は以下で実施しました。今回UbuntuPCを準備しましたが、おそらくDocker環境などでもできると思います。
■ビルドPC
・Ubuntu 24.04.1 LTS
・ROS2 jazzy インストール済
手順
ビルドに必要なライブラリ等をインストール
sudo apt install default-jdk
sudo apt install gradle
sudo apt install curl python3-colcon-common-extensions python3-pip python3-vcstool
python3 -m pip install -U git+https://github.com/colcon/colcon-gradle --break-system-packages
python3 -m pip install --no-deps -U git+https://github.com/colcon/colcon-ros-gradle --break-system-packages
Android NDK、SDKをダウンロードします。
Android用の環境変数を.bashrcに記載しました。
export ANDROID_HOME=~/Android/Sdk
export ANDROID_NDK=~/Android/android-ndk-r27c-linux/android-ndk-r27c
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH
ros2_javaビルド環境を準備
作業用のディレクトリを作ります。
mkdir -p $HOME/ros2_android_ws/src
cd $HOME/ros2_android_ws
以下コマンドでreposファイルに記載されたソースを落としてきます。
※ここで重要なのが、ros2 jazzyに対応されたソースを落としてきますので、URLをros2_java jazzy用のリポジトリにする必要があります。
curl -skL https://raw.githubusercontent.com/skalldri/ros2_java/jazzy/ros2_java_android.repos | vcs import src
ビルドする
ビルドに必要な環境変数を設定します。
export PYTHON3_EXEC="$( which python3 )"
export PYTHON3_LIBRARY="$( ${PYTHON3_EXEC} -c 'import os.path; from distutils import sysconfig; print(os.path.realpath(os.path.join(sysconfig.get_config_var("LIBPL"), sysconfig.get_config_var("LDLIBRARY"))))' )"
export PYTHON3_INCLUDE_DIR="$( ${PYTHON3_EXEC} -c 'from distutils import sysconfig; print(sysconfig.get_config_var("INCLUDEPY"))' )"
export ANDROID_ABI=arm64-v8a
export ANDROID_NATIVE_API_LEVEL=android-24
export ANDROID_STL=c++_shared
export ANDROID_SDK_ROOT=${ANDROID_HOME}
以下コマンドでビルドします。
colcon build \
--metas src/ros2-java/ros2_java/colcon.android.meta \
--symlink-install \
--event-handlers console_cohesion+ \
--packages-up-to rclandroid \
--packages-ignore uncrustify_vendor rosidl_generator_py \
--gradle-args \
--debug --info -Pament.android_stl=${ANDROID_STL} -Pament.android_abi=${ANDROID_ABI} -Pament.android_ndk=${ANDROID_NDK} -Pament.android_variant=release \
--cmake-args \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DANDROID_FUNCTION_LEVEL_LINKING=OFF \
-DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \
-DANDROID_ABI=${ANDROID_ABI} \
-DANDROID_NDK=${ANDROID_NDK} \
-DANDROID_STL=${ANDROID_STL} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_FIND_ROOT_PATH="${PWD}/install" \
-DPython3_EXECUTABLE=${PYTHON3_EXEC} \
-DPython3_LIBRARY=${PYTHON3_LIBRARY} \
-DPython3_INCLUDE_DIR=${PYTHON3_INCLUDE_DIR}
最後のrclandroidでビルドエラーが出てしまいましたが、
rclandroidだけエラーで他のパッケージは問題なくビルドできていそうでした。
rclandroidは、アプリ用のパッケージなので一旦無視して、とりあえず、出来上がったsoファイルとjarファイルを使ってみることにしました。
出来上がったsoファイル、jarファイルを集める
出来上がったjarファイルとsoファイルを集めてフォルダに格納します。
以下のようなシェル(output_copy.sh)を作りました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash # install フォルダを特定 INSTALL_DIR=$(find . -type d -name "install" | head -n 1) # コピー先ディレクトリ SO_DIR="soFile" JAR_DIR="jarFile" # コピー先ディレクトリが存在しない場合、作成 mkdir -p $SO_DIR mkdir -p $JAR_DIR # install 配下の .so ファイルをコピー #find ./install/ -type f -name "*.so" -exec cp {} "$SO_DIR/" \; -print find ./install/ -name "*.so" -exec cp {} "$SO_DIR/" \; -print # install 配下の .jar ファイルをコピー #find install -type f -name "*.jar" -exec cp {} "$JAR_DIR/" \; find ./install/ -name "*.jar" -exec cp {} "$JAR_DIR/" \; -print # 終了メッセージ echo "コピー完了: .so -> $SO_DIR, .jar -> $JAR_DIR" |
output_copy.shを実行します。
chmod +x output_copy.sh
./output_copy.sh
最後に、該当するアーキテクチャ(今回はarm64-v8a)のlibc++_shared.soをsoFileにコピーします。
※libc++_shared.soは、AndroidNDK内にあります。
※注意:libc++_shared.soがないと、アプリ立ち上げ時にエラーで起動しません。
cp ${ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/libc++_shared.so ./soFile
以下のROS2用のAndroidサンプルアプリがあります.
GitHub(ros2-android-test)
作ったsoFileとjarFileをAndroidプロジェクトに格納します。
・jarファイル→app/libsフォルダ内に格納
・soファイル→app/src/main/jniLibs/arm64-v8aフォルダ内に格納
これでROS2 jazzy端末とAndroidアプリ間で通信できました。
最後に
OSSのライブラリは日々更新されていくので、しばらくするとまたビルドが通らなかったり、トラブルがあるかもしれません。
とりあえず、一旦はこのライブラリを使ったROS2 Jazzy用のAndroidアプリを作っていく予定です。
それでは!
スポンサーリンク