2023-02-22 22:36:05 +08:00
#!/usr/bin/env bash
set -ex
2024-12-14 09:53:44 +08:00
# If BUILD_SHARED_LIBS is ON, we use libonnxruntime.so
# If BUILD_SHARED_LIBS is OFF, we use libonnxruntime.a
#
# In any case, we will have libsherpa-onnx-jni.so
#
# If BUILD_SHARED_LIBS is OFF, then libonnxruntime.a is linked into libsherpa-onnx-jni.so
# and you only need to copy libsherpa-onnx-jni.so to your Android projects.
#
# If BUILD_SHARED_LIBS is ON, then you need to copy both libsherpa-onnx-jni.so
# and libonnxruntime.so to your Android projects
#
if [ -z $BUILD_SHARED_LIBS ] ; then
BUILD_SHARED_LIBS = ON
fi
if [ $BUILD_SHARED_LIBS = = ON ] ; then
dir = $PWD /build-android-arm64-v8a
else
dir = $PWD /build-android-arm64-v8a-static
fi
2023-02-22 22:36:05 +08:00
mkdir -p $dir
cd $dir
# Note from https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-android
# (optional) remove the hardcoded debug flag in Android NDK android-ndk
# issue: https://github.com/android/ndk/issues/243
#
# open $ANDROID_NDK/build/cmake/android.toolchain.cmake for ndk < r23
# or $ANDROID_NDK/build/cmake/android-legacy.toolchain.cmake for ndk >= r23
#
# delete "-g" line
#
# list(APPEND ANDROID_COMPILER_FLAGS
# -g
# -DANDROID
if [ -z $ANDROID_NDK ] ; then
2024-01-05 20:34:01 +08:00
ANDROID_NDK = /star-fj/fangjun/software/android-sdk/ndk/22.1.7171670
2024-12-14 09:53:44 +08:00
if [ $BUILD_SHARED_LIBS = = OFF ] ; then
ANDROID_NDK = /star-fj/fangjun/software/android-sdk/ndk/27.0.11718014
fi
2023-02-22 22:36:05 +08:00
# or use
2024-01-05 20:34:01 +08:00
# ANDROID_NDK=/star-fj/fangjun/software/android-ndk
2023-02-22 22:36:05 +08:00
#
# Inside the $ANDROID_NDK directory, you can find a binary ndk-build
# and some other files like the file "build/cmake/android.toolchain.cmake"
if [ ! -d $ANDROID_NDK ] ; then
# For macOS, I have installed Android Studio, select the menu
# Tools -> SDK manager -> Android SDK
# and set "Android SDK location" to /Users/fangjun/software/my-android
ANDROID_NDK = /Users/fangjun/software/my-android/ndk/22.1.7171670
2024-12-14 09:53:44 +08:00
if [ $BUILD_SHARED_LIBS = = OFF ] ; then
ANDROID_NDK = /Users/fangjun/software/my-android/ndk/27.0.11718014
fi
2023-02-22 22:36:05 +08:00
fi
fi
if [ ! -d $ANDROID_NDK ] ; then
echo Please set the environment variable ANDROID_NDK before you run this script
exit 1
fi
echo " ANDROID_NDK: $ANDROID_NDK "
sleep 1
2024-07-15 14:24:08 +08:00
onnxruntime_version = 1.17.1
2023-02-22 22:36:05 +08:00
2024-12-14 09:53:44 +08:00
if [ $BUILD_SHARED_LIBS = = ON ] ; then
if [ ! -f $onnxruntime_version /jni/arm64-v8a/libonnxruntime.so ] ; then
mkdir -p $onnxruntime_version
pushd $onnxruntime_version
wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${ onnxruntime_version } /onnxruntime-android-${ onnxruntime_version } .zip
unzip onnxruntime-android-${ onnxruntime_version } .zip
rm onnxruntime-android-${ onnxruntime_version } .zip
popd
fi
2023-02-24 13:57:03 +08:00
2024-12-14 09:53:44 +08:00
export SHERPA_ONNXRUNTIME_LIB_DIR = $dir /$onnxruntime_version /jni/arm64-v8a/
export SHERPA_ONNXRUNTIME_INCLUDE_DIR = $dir /$onnxruntime_version /headers/
else
if [ ! -f ${ onnxruntime_version } -static/lib/libonnxruntime.a ] ; then
wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${ onnxruntime_version } /onnxruntime-android-arm64-v8a-static_lib-${ onnxruntime_version } .zip
unzip onnxruntime-android-arm64-v8a-static_lib-${ onnxruntime_version } .zip
rm onnxruntime-android-arm64-v8a-static_lib-${ onnxruntime_version } .zip
mv onnxruntime-android-arm64-v8a-static_lib-${ onnxruntime_version } ${ onnxruntime_version } -static
fi
export SHERPA_ONNXRUNTIME_LIB_DIR = $dir /$onnxruntime_version -static/lib/
export SHERPA_ONNXRUNTIME_INCLUDE_DIR = $dir /$onnxruntime_version -static/include/
fi
2023-02-24 13:57:03 +08:00
echo " SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR "
echo " SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR "
2025-04-15 16:42:28 +08:00
if [ -z $SHERPA_ONNX_ENABLE_RKNN ] ; then
SHERPA_ONNX_ENABLE_RKNN = OFF
fi
if [ $SHERPA_ONNX_ENABLE_RKNN = = ON ] ; then
rknn_version = 2.2.0
if [ ! -d ./librknnrt-android ] ; then
rm -fv librknnrt-android.tar.bz2
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/librknnrt-android.tar.bz2
tar xvf librknnrt-android.tar.bz2
rm librknnrt-android.tar.bz2
fi
export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR = $PWD /librknnrt-android/v$rknn_version /arm64-v8a/
export CPLUS_INCLUDE_PATH = $PWD /librknnrt-android/v$rknn_version /include:$CPLUS_INCLUDE_PATH
fi
2024-04-24 09:48:42 +08:00
if [ -z $SHERPA_ONNX_ENABLE_TTS ] ; then
SHERPA_ONNX_ENABLE_TTS = ON
fi
2024-09-30 11:33:15 +08:00
if [ -z $SHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION ] ; then
SHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION = ON
fi
2024-04-24 09:48:42 +08:00
if [ -z $SHERPA_ONNX_ENABLE_BINARY ] ; then
SHERPA_ONNX_ENABLE_BINARY = OFF
fi
2024-07-04 10:49:09 +08:00
if [ -z $SHERPA_ONNX_ENABLE_C_API ] ; then
SHERPA_ONNX_ENABLE_C_API = OFF
fi
if [ -z $SHERPA_ONNX_ENABLE_JNI ] ; then
SHERPA_ONNX_ENABLE_JNI = ON
fi
2023-02-22 22:36:05 +08:00
cmake -DCMAKE_TOOLCHAIN_FILE= " $ANDROID_NDK /build/cmake/android.toolchain.cmake " \
2024-04-24 09:48:42 +08:00
-DSHERPA_ONNX_ENABLE_TTS= $SHERPA_ONNX_ENABLE_TTS \
2024-09-30 11:33:15 +08:00
-DSHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION= $SHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION \
2024-04-24 09:48:42 +08:00
-DSHERPA_ONNX_ENABLE_BINARY= $SHERPA_ONNX_ENABLE_BINARY \
2023-11-28 19:12:58 +08:00
-DBUILD_PIPER_PHONMIZE_EXE= OFF \
-DBUILD_PIPER_PHONMIZE_TESTS= OFF \
-DBUILD_ESPEAK_NG_EXE= OFF \
-DBUILD_ESPEAK_NG_TESTS= OFF \
2023-02-22 22:36:05 +08:00
-DCMAKE_BUILD_TYPE= Release \
2024-12-14 09:53:44 +08:00
-DBUILD_SHARED_LIBS= $BUILD_SHARED_LIBS \
2023-02-22 22:36:05 +08:00
-DSHERPA_ONNX_ENABLE_PYTHON= OFF \
-DSHERPA_ONNX_ENABLE_TESTS= OFF \
-DSHERPA_ONNX_ENABLE_CHECK= OFF \
-DSHERPA_ONNX_ENABLE_PORTAUDIO= OFF \
2024-07-04 10:49:09 +08:00
-DSHERPA_ONNX_ENABLE_JNI= $SHERPA_ONNX_ENABLE_JNI \
2024-12-14 09:53:44 +08:00
-DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY= OFF \
2024-07-04 10:49:09 +08:00
-DSHERPA_ONNX_ENABLE_C_API= $SHERPA_ONNX_ENABLE_C_API \
2023-02-22 22:36:05 +08:00
-DCMAKE_INSTALL_PREFIX= ./install \
2025-04-15 16:42:28 +08:00
-DSHERPA_ONNX_ENABLE_RKNN= $SHERPA_ONNX_ENABLE_RKNN \
2023-02-22 22:36:05 +08:00
-DANDROID_ABI= "arm64-v8a" \
-DANDROID_PLATFORM= android-21 ..
2023-02-24 13:57:03 +08:00
2024-12-14 09:53:44 +08:00
# By default, it links to libc++_static.a
# -DANDROID_STL=c++_shared \
2024-03-01 16:39:48 +08:00
# Please use -DANDROID_PLATFORM=android-27 if you want to use Android NNAPI
2023-02-22 22:36:05 +08:00
# make VERBOSE=1 -j4
make -j4
make install/strip
2024-12-14 09:53:44 +08:00
cp -fv $onnxruntime_version /jni/arm64-v8a/libonnxruntime.so install/lib 2>/dev/null || true
2025-04-15 16:42:28 +08:00
if [ $SHERPA_ONNX_ENABLE_RKNN = = ON ] ; then
cp -fv $SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR /librknnrt.so install/lib
fi
2024-12-14 09:53:44 +08:00
rm -rf install/share
2023-11-30 23:57:43 +08:00
rm -rf install/lib/pkgconfig
2024-12-14 09:53:44 +08:00
rm -rf install/lib/lib*.a
2025-01-07 11:04:10 +08:00
if [ -f install/lib/libsherpa-onnx-c-api.so ] ; then
cat >install/lib/README.md <<EOF
# Introduction
Note that if you use Android Studio, then you only need to
copy libonnxruntime.so and libsherpa-onnx-jni.so
to your jniLibs, and you don' t need libsherpa-onnx-c-api.so or
libsherpa-onnx-cxx-api.so.
libsherpa-onnx-c-api.so and libsherpa-onnx-cxx-api.so are for users
who don' t use JNI. In that case , libsherpa-onnx-jni.so is not needed.
In any case , libonnxruntime.is is always needed.
EOF
ls -lh install/lib/README.md
fi
2024-03-01 16:39:48 +08:00
# To run the generated binaries on Android, please use the following steps.
#
#
# 1. Copy sherpa-onnx and its dependencies to Android
#
# cd build-android-arm64-v8a/install/lib
# adb push ./lib*.so /data/local/tmp
# cd ../bin
# adb push ./sherpa-onnx /data/local/tmp
#
# 2. Login into Android
#
# adb shell
# cd /data/local/tmp
# ./sherpa-onnx
#
# It should show the help message of sherpa-onnx.
#
# Please use the above approach to copy model files to your phone.
2025-04-15 16:42:28 +08:00
#
# ----------------------------------------
# For android rknn
# ----------------------------------------
# If you get the following error from the logcat
# 2025-04-15 15:27:43.441 19568-19646 RKNN com.k2fsa.sherpa.onnx E Meet unsupported input dtype for gather
# 2025-04-15 15:27:43.442 19568-19646 RKNN com.k2fsa.sherpa.onnx E Op type:Gather, name: Gather:/Concat_78_2gather, fallback cpu failed. If using rknn, update to the latest toolkit2 and runtime from: https://console.zbox.filez.com/l/I00fc3 (PWD: rknn). If using rknn-llm, update from: https://github.com/airockchip/rknn-llm
# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Return code is: -1
# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Failed to run encoder
#
# You need to update /vendor/lib64/librknnrt.so and /vendor/lib/librknnrt.so
#
# adb root
# adb remount /vendor
# adb push ./install/lib/librknnrt.so /vendor/lib64
# adb push ./install/lib/librknnrt.so /vendor/lib