Fangjun Kuang
Committed by GitHub

Support linking onnxruntime statically for Android (#1619)

  1 +# static means we link onnxruntime statically
  2 +# but we still have libsherpa-onnx-jni.so
  3 +name: android-static
  4 +
  5 +on:
  6 + push:
  7 + branches:
  8 + - master
  9 + - android-link-onnxruntime-statically
  10 + paths:
  11 + - '.github/workflows/android-static.yaml'
  12 + - 'CMakeLists.txt'
  13 + - 'cmake/**'
  14 + - 'sherpa-onnx/csrc/*'
  15 + - 'sherpa-onnx/jni/*'
  16 + - 'build-android*.sh'
  17 + tags:
  18 + - 'v[0-9]+.[0-9]+.[0-9]+*'
  19 + pull_request:
  20 + branches:
  21 + - master
  22 + paths:
  23 + - '.github/workflows/android-static.yaml'
  24 + - 'CMakeLists.txt'
  25 + - 'cmake/**'
  26 + - 'sherpa-onnx/csrc/*'
  27 + - 'sherpa-onnx/jni/*'
  28 + - 'build-android*.sh'
  29 +
  30 + workflow_dispatch:
  31 +
  32 +concurrency:
  33 + group: android-static-${{ github.ref }}
  34 + cancel-in-progress: true
  35 +
  36 +jobs:
  37 + build-android-static-libs:
  38 + name: Android static libs
  39 + runs-on: ${{ matrix.os }}
  40 + strategy:
  41 + fail-fast: false
  42 + matrix:
  43 + os: [ubuntu-latest]
  44 +
  45 + steps:
  46 + - uses: actions/checkout@v4
  47 + with:
  48 + fetch-depth: 0
  49 +
  50 + - name: ccache
  51 + uses: hendrikmuhs/ccache-action@v1.2
  52 + with:
  53 + key: ${{ matrix.os }}-android-jni-static
  54 +
  55 + - name: Display NDK HOME
  56 + shell: bash
  57 + run: |
  58 + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
  59 + ls -lh ${ANDROID_NDK_LATEST_HOME}
  60 +
  61 + - name: build android arm64-v8a
  62 + shell: bash
  63 + run: |
  64 + export BUILD_SHARED_LIBS=OFF
  65 +
  66 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  67 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  68 +
  69 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  70 + ./build-android-arm64-v8a.sh
  71 + mkdir -p jniLibs/arm64-v8a/
  72 + cp -v ./build-android-arm64-v8a-static/install/lib/*.so ./jniLibs/arm64-v8a/
  73 + rm -rf ./build-android-arm64-v8a-static/
  74 +
  75 + - name: build android armv7-eabi
  76 + shell: bash
  77 + run: |
  78 + export BUILD_SHARED_LIBS=OFF
  79 +
  80 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  81 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  82 +
  83 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  84 + ./build-android-armv7-eabi.sh
  85 + mkdir -p ./jniLibs/armeabi-v7a/
  86 + cp -v ./build-android-armv7-eabi-static/install/lib/*.so ./jniLibs/armeabi-v7a/
  87 + rm -rf ./build-android-armv7-eabi-static
  88 +
  89 + - name: build android x86_64
  90 + shell: bash
  91 + run: |
  92 + export BUILD_SHARED_LIBS=OFF
  93 +
  94 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  95 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  96 +
  97 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  98 + ./build-android-x86-64.sh
  99 + mkdir -p ./jniLibs/x86_64
  100 + cp -v ./build-android-x86-64-static/install/lib/*.so ./jniLibs/x86_64
  101 + rm -rf ./build-android-x86-64-static
  102 +
  103 + - name: build android x86
  104 + shell: bash
  105 + run: |
  106 + export BUILD_SHARED_LIBS=OFF
  107 +
  108 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  109 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  110 +
  111 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  112 + ./build-android-x86.sh
  113 + mkdir -p ./jniLibs/x86
  114 + cp -v ./build-android-x86/install/lib/*.so ./jniLibs/x86
  115 + rm -rf ./build-android-x86
  116 +
  117 + - name: Copy files
  118 + shell: bash
  119 + run: |
  120 + SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  121 + echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"
  122 +
  123 + filename=sherpa-onnx-${SHERPA_ONNX_VERSION}-android-static-link-onnxruntime.tar.bz2
  124 +
  125 + tar cjvf $filename ./jniLibs
  126 +
  127 + ls -lh
  128 +
  129 + - uses: actions/upload-artifact@v4
  130 + with:
  131 + name: sherpa-onnx-android-libs-static
  132 + path: ./jniLibs
  133 +
  134 + # https://huggingface.co/docs/hub/spaces-github-actions
  135 + - name: Publish to huggingface
  136 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
  137 + env:
  138 + HF_TOKEN: ${{ secrets.HF_TOKEN }}
  139 + uses: nick-fields/retry@v3
  140 + with:
  141 + max_attempts: 20
  142 + timeout_seconds: 200
  143 + shell: bash
  144 + command: |
  145 + git config --global user.email "csukuangfj@gmail.com"
  146 + git config --global user.name "Fangjun Kuang"
  147 + du -h -d1 .
  148 + ls -lh
  149 +
  150 + rm -rf huggingface
  151 + export GIT_CLONE_PROTECTION_ACTIVE=false
  152 + GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface
  153 +
  154 + cd huggingface
  155 +
  156 + cp -v ../sherpa-onnx-*-android*.tar.bz2 ./
  157 +
  158 + git status
  159 + git lfs track "*.bz2"
  160 +
  161 + git add .
  162 +
  163 + git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-android.tar.bz2"
  164 +
  165 + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main
  166 +
  167 + - name: Release android libs
  168 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
  169 + uses: svenstaro/upload-release-action@v2
  170 + with:
  171 + file_glob: true
  172 + overwrite: true
  173 + file: sherpa-onnx-*-android*.tar.bz2
  174 +
  175 + build-android-aar-static:
  176 + needs: [build-android-static-libs]
  177 + name: Android AAR
  178 + runs-on: ${{ matrix.os }}
  179 + strategy:
  180 + fail-fast: false
  181 + matrix:
  182 + os: [ubuntu-latest]
  183 +
  184 + steps:
  185 + - uses: actions/checkout@v4
  186 + with:
  187 + fetch-depth: 0
  188 +
  189 + # https://github.com/actions/setup-java
  190 + - uses: actions/setup-java@v4
  191 + with:
  192 + distribution: 'temurin' # See 'Supported distributions' for available options
  193 + java-version: '21'
  194 +
  195 + - name: Display NDK HOME
  196 + shell: bash
  197 + run: |
  198 + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
  199 + ls -lh ${ANDROID_NDK_LATEST_HOME}
  200 +
  201 + - name: Retrieve artifact
  202 + uses: actions/download-artifact@v4
  203 + with:
  204 + name: sherpa-onnx-android-libs-static
  205 + path: /tmp/jniLibs
  206 +
  207 + - name: Show jni libs
  208 + shell: bash
  209 + run: |
  210 + ls -lh /tmp/jniLibs
  211 +
  212 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 arm64-v8a
  213 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 armeabi-v7a
  214 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 x86
  215 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 x86_64
  216 + #
  217 + - name: Copy libs
  218 + shell: bash
  219 + run: |
  220 + for arch in arm64-v8a armeabi-v7a x86 x86_64; do
  221 + cp -v /tmp/jniLibs/$arch/* android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/$arch/
  222 + done
  223 +
  224 + - name: Check libs
  225 + shell: bash
  226 + run: |
  227 + ls -lh android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/*
  228 +
  229 + - name: Build aar
  230 + shell: bash
  231 + run: |
  232 + cd android/SherpaOnnxAar
  233 +
  234 + ./gradlew :sherpa_onnx:assembleRelease
  235 +
  236 + - name: Display aar
  237 + shell: bash
  238 + run: |
  239 + cd android/SherpaOnnxAar
  240 +
  241 + ls -lh ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar
  242 + cp ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar ../../
  243 +
  244 + - name: Rename aar
  245 + shell: bash
  246 + run: |
  247 + SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  248 + echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"
  249 +
  250 + mv sherpa_onnx-release.aar sherpa-onnx-static-link-onnxruntime-${SHERPA_ONNX_VERSION}.aar
  251 +
  252 + - uses: actions/upload-artifact@v4
  253 + with:
  254 + name: sherpa-onnx-android-aar-static
  255 + path: ./*.aar
  256 +
  257 + # https://huggingface.co/docs/hub/spaces-github-actions
  258 + - name: Publish to huggingface
  259 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
  260 + env:
  261 + HF_TOKEN: ${{ secrets.HF_TOKEN }}
  262 + uses: nick-fields/retry@v3
  263 + with:
  264 + max_attempts: 20
  265 + timeout_seconds: 200
  266 + shell: bash
  267 + command: |
  268 + git config --global user.email "csukuangfj@gmail.com"
  269 + git config --global user.name "Fangjun Kuang"
  270 + du -h -d1 .
  271 + ls -lh
  272 +
  273 + rm -rf huggingface
  274 + export GIT_CLONE_PROTECTION_ACTIVE=false
  275 + GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface
  276 +
  277 + cd huggingface
  278 + dst=android/aar
  279 + mkdir -p $dst
  280 +
  281 + cp -v ../*.aar $dst
  282 +
  283 + git status
  284 + git lfs track "*.aar"
  285 +
  286 + git add .
  287 +
  288 + git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}.aar"
  289 +
  290 + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main
  291 +
  292 + - name: Release android aar
  293 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
  294 + uses: svenstaro/upload-release-action@v2
  295 + with:
  296 + file_glob: true
  297 + overwrite: true
  298 + file: ./*.aar
@@ -82,11 +82,6 @@ if(SHERPA_ONNX_ENABLE_PYTHON AND NOT BUILD_SHARED_LIBS) @@ -82,11 +82,6 @@ if(SHERPA_ONNX_ENABLE_PYTHON AND NOT BUILD_SHARED_LIBS)
82 set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) 82 set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
83 endif() 83 endif()
84 84
85 -if(SHERPA_ONNX_ENABLE_JNI AND NOT BUILD_SHARED_LIBS)  
86 - message(STATUS "Set BUILD_SHARED_LIBS to ON since SHERPA_ONNX_ENABLE_JNI is ON")  
87 - set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)  
88 -endif()  
89 -  
90 if(SHERPA_ONNX_ENABLE_GPU) 85 if(SHERPA_ONNX_ENABLE_GPU)
91 message(WARNING "\ 86 message(WARNING "\
92 Compiling for NVIDIA GPU is enabled. Please make sure cudatoolkit 87 Compiling for NVIDIA GPU is enabled. Please make sure cudatoolkit
@@ -157,7 +152,7 @@ message(STATUS "SHERPA_ONNX_USE_PRE_INSTALLED_ONNXRUNTIME_IF_AVAILABLE ${SHERPA_ @@ -157,7 +152,7 @@ message(STATUS "SHERPA_ONNX_USE_PRE_INSTALLED_ONNXRUNTIME_IF_AVAILABLE ${SHERPA_
157 message(STATUS "SHERPA_ONNX_ENABLE_SANITIZER: ${SHERPA_ONNX_ENABLE_SANITIZER}") 152 message(STATUS "SHERPA_ONNX_ENABLE_SANITIZER: ${SHERPA_ONNX_ENABLE_SANITIZER}")
158 message(STATUS "SHERPA_ONNX_BUILD_C_API_EXAMPLES: ${SHERPA_ONNX_BUILD_C_API_EXAMPLES}") 153 message(STATUS "SHERPA_ONNX_BUILD_C_API_EXAMPLES: ${SHERPA_ONNX_BUILD_C_API_EXAMPLES}")
159 154
160 -if(BUILD_SHARED_LIBS) 155 +if(BUILD_SHARED_LIBS OR SHERPA_ONNX_ENABLE_JNI)
161 set(CMAKE_CXX_VISIBILITY_PRESET hidden) 156 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
162 set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) 157 set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
163 set(CMAKE_POSITION_INDEPENDENT_CODE ON) 158 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 set -ex 2 set -ex
3 3
4 -dir=$PWD/build-android-arm64-v8a 4 +# If BUILD_SHARED_LIBS is ON, we use libonnxruntime.so
  5 +# If BUILD_SHARED_LIBS is OFF, we use libonnxruntime.a
  6 +#
  7 +# In any case, we will have libsherpa-onnx-jni.so
  8 +#
  9 +# If BUILD_SHARED_LIBS is OFF, then libonnxruntime.a is linked into libsherpa-onnx-jni.so
  10 +# and you only need to copy libsherpa-onnx-jni.so to your Android projects.
  11 +#
  12 +# If BUILD_SHARED_LIBS is ON, then you need to copy both libsherpa-onnx-jni.so
  13 +# and libonnxruntime.so to your Android projects
  14 +#
  15 +if [ -z $BUILD_SHARED_LIBS ]; then
  16 + BUILD_SHARED_LIBS=ON
  17 +fi
  18 +
  19 +if [ $BUILD_SHARED_LIBS == ON ]; then
  20 + dir=$PWD/build-android-arm64-v8a
  21 +else
  22 + dir=$PWD/build-android-arm64-v8a-static
  23 +fi
5 24
6 mkdir -p $dir 25 mkdir -p $dir
7 cd $dir 26 cd $dir
@@ -21,6 +40,9 @@ cd $dir @@ -21,6 +40,9 @@ cd $dir
21 40
22 if [ -z $ANDROID_NDK ]; then 41 if [ -z $ANDROID_NDK ]; then
23 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670 42 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670
  43 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  44 + ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/27.0.11718014
  45 + fi
24 # or use 46 # or use
25 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk 47 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk
26 # 48 #
@@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then @@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then
32 # Tools -> SDK manager -> Android SDK 54 # Tools -> SDK manager -> Android SDK
33 # and set "Android SDK location" to /Users/fangjun/software/my-android 55 # and set "Android SDK location" to /Users/fangjun/software/my-android
34 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670 56 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670
  57 +
  58 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  59 + ANDROID_NDK=/Users/fangjun/software/my-android/ndk/27.0.11718014
  60 + fi
35 fi 61 fi
36 fi 62 fi
37 63
@@ -44,17 +70,29 @@ echo "ANDROID_NDK: $ANDROID_NDK" @@ -44,17 +70,29 @@ echo "ANDROID_NDK: $ANDROID_NDK"
44 sleep 1 70 sleep 1
45 onnxruntime_version=1.17.1 71 onnxruntime_version=1.17.1
46 72
47 -if [ ! -f $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so ]; then  
48 - mkdir -p $onnxruntime_version  
49 - pushd $onnxruntime_version  
50 - wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip  
51 - unzip onnxruntime-android-${onnxruntime_version}.zip  
52 - rm onnxruntime-android-${onnxruntime_version}.zip  
53 - popd  
54 -fi 73 +if [ $BUILD_SHARED_LIBS == ON ]; then
  74 + if [ ! -f $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so ]; then
  75 + mkdir -p $onnxruntime_version
  76 + pushd $onnxruntime_version
  77 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip
  78 + unzip onnxruntime-android-${onnxruntime_version}.zip
  79 + rm onnxruntime-android-${onnxruntime_version}.zip
  80 + popd
  81 + fi
55 82
56 -export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/arm64-v8a/  
57 -export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/ 83 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/arm64-v8a/
  84 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/
  85 +else
  86 + if [ ! -f ${onnxruntime_version}-static/lib/libonnxruntime.a ]; then
  87 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-arm64-v8a-static_lib-${onnxruntime_version}.zip
  88 + unzip onnxruntime-android-arm64-v8a-static_lib-${onnxruntime_version}.zip
  89 + rm onnxruntime-android-arm64-v8a-static_lib-${onnxruntime_version}.zip
  90 + mv onnxruntime-android-arm64-v8a-static_lib-${onnxruntime_version} ${onnxruntime_version}-static
  91 + fi
  92 +
  93 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version-static/lib/
  94 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version-static/include/
  95 +fi
58 96
59 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" 97 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
60 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" 98 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"
@@ -88,24 +126,30 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -88,24 +126,30 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
88 -DBUILD_ESPEAK_NG_EXE=OFF \ 126 -DBUILD_ESPEAK_NG_EXE=OFF \
89 -DBUILD_ESPEAK_NG_TESTS=OFF \ 127 -DBUILD_ESPEAK_NG_TESTS=OFF \
90 -DCMAKE_BUILD_TYPE=Release \ 128 -DCMAKE_BUILD_TYPE=Release \
91 - -DBUILD_SHARED_LIBS=ON \ 129 + -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \
92 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ 130 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
93 -DSHERPA_ONNX_ENABLE_TESTS=OFF \ 131 -DSHERPA_ONNX_ENABLE_TESTS=OFF \
94 -DSHERPA_ONNX_ENABLE_CHECK=OFF \ 132 -DSHERPA_ONNX_ENABLE_CHECK=OFF \
95 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ 133 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
96 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \ 134 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \
  135 + -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
97 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \ 136 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
98 -DCMAKE_INSTALL_PREFIX=./install \ 137 -DCMAKE_INSTALL_PREFIX=./install \
99 -DANDROID_ABI="arm64-v8a" \ 138 -DANDROID_ABI="arm64-v8a" \
100 -DANDROID_PLATFORM=android-21 .. 139 -DANDROID_PLATFORM=android-21 ..
101 140
  141 + # By default, it links to libc++_static.a
  142 + # -DANDROID_STL=c++_shared \
  143 +
102 # Please use -DANDROID_PLATFORM=android-27 if you want to use Android NNAPI 144 # Please use -DANDROID_PLATFORM=android-27 if you want to use Android NNAPI
103 145
104 # make VERBOSE=1 -j4 146 # make VERBOSE=1 -j4
105 make -j4 147 make -j4
106 make install/strip 148 make install/strip
107 -cp -fv $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so install/lib 149 +cp -fv $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so install/lib 2>/dev/null || true
  150 +rm -rf install/share
108 rm -rf install/lib/pkgconfig 151 rm -rf install/lib/pkgconfig
  152 +rm -rf install/lib/lib*.a
109 153
110 # To run the generated binaries on Android, please use the following steps. 154 # To run the generated binaries on Android, please use the following steps.
111 # 155 #
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 set -ex 2 set -ex
3 3
4 -dir=$PWD/build-android-armv7-eabi 4 +# If BUILD_SHARED_LIBS is ON, we use libonnxruntime.so
  5 +# If BUILD_SHARED_LIBS is OFF, we use libonnxruntime.a
  6 +#
  7 +# In any case, we will have libsherpa-onnx-jni.so
  8 +#
  9 +# If BUILD_SHARED_LIBS is OFF, then libonnxruntime.a is linked into libsherpa-onnx-jni.so
  10 +# and you only need to copy libsherpa-onnx-jni.so to your Android projects.
  11 +#
  12 +# If BUILD_SHARED_LIBS is ON, then you need to copy both libsherpa-onnx-jni.so
  13 +# and libonnxruntime.so to your Android projects
  14 +#
  15 +if [ -z $BUILD_SHARED_LIBS ]; then
  16 + BUILD_SHARED_LIBS=ON
  17 +fi
  18 +
  19 +if [ $BUILD_SHARED_LIBS == ON ]; then
  20 + dir=$PWD/build-android-armv7-eabi
  21 +else
  22 + dir=$PWD/build-android-armv7-eabi-static
  23 +fi
5 24
6 mkdir -p $dir 25 mkdir -p $dir
7 cd $dir 26 cd $dir
@@ -21,6 +40,9 @@ cd $dir @@ -21,6 +40,9 @@ cd $dir
21 40
22 if [ -z $ANDROID_NDK ]; then 41 if [ -z $ANDROID_NDK ]; then
23 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670 42 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670
  43 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  44 + ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/27.0.11718014
  45 + fi
24 # or use 46 # or use
25 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk 47 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk
26 # 48 #
@@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then @@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then
32 # Tools -> SDK manager -> Android SDK 54 # Tools -> SDK manager -> Android SDK
33 # and set "Android SDK location" to /Users/fangjun/software/my-android 55 # and set "Android SDK location" to /Users/fangjun/software/my-android
34 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670 56 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670
  57 +
  58 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  59 + ANDROID_NDK=/Users/fangjun/software/my-android/ndk/27.0.11718014
  60 + fi
35 fi 61 fi
36 fi 62 fi
37 63
@@ -45,17 +71,29 @@ sleep 1 @@ -45,17 +71,29 @@ sleep 1
45 71
46 onnxruntime_version=1.17.1 72 onnxruntime_version=1.17.1
47 73
48 -if [ ! -f $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so ]; then  
49 - mkdir -p $onnxruntime_version  
50 - pushd $onnxruntime_version  
51 - wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip  
52 - unzip onnxruntime-android-${onnxruntime_version}.zip  
53 - rm onnxruntime-android-${onnxruntime_version}.zip  
54 - popd  
55 -fi 74 +if [ $BUILD_SHARED_LIBS == ON ]; then
  75 + if [ ! -f $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so ]; then
  76 + mkdir -p $onnxruntime_version
  77 + pushd $onnxruntime_version
  78 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip
  79 + unzip onnxruntime-android-${onnxruntime_version}.zip
  80 + rm onnxruntime-android-${onnxruntime_version}.zip
  81 + popd
  82 + fi
  83 +
  84 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/armeabi-v7a/
  85 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/
  86 +else
  87 + if [ ! -f ${onnxruntime_version}-static/lib/libonnxruntime.a ]; then
  88 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-armeabi-v7a-static_lib-${onnxruntime_version}.zip
  89 + unzip onnxruntime-android-armeabi-v7a-static_lib-${onnxruntime_version}.zip
  90 + rm onnxruntime-android-armeabi-v7a-static_lib-${onnxruntime_version}.zip
  91 + mv onnxruntime-android-armeabi-v7a-static_lib-${onnxruntime_version} ${onnxruntime_version}-static
  92 + fi
56 93
57 -export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/armeabi-v7a/  
58 -export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/ 94 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version-static/lib/
  95 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version-static/include/
  96 +fi
59 97
60 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" 98 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
61 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" 99 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"
@@ -89,18 +127,25 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -89,18 +127,25 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
89 -DBUILD_ESPEAK_NG_EXE=OFF \ 127 -DBUILD_ESPEAK_NG_EXE=OFF \
90 -DBUILD_ESPEAK_NG_TESTS=OFF \ 128 -DBUILD_ESPEAK_NG_TESTS=OFF \
91 -DCMAKE_BUILD_TYPE=Release \ 129 -DCMAKE_BUILD_TYPE=Release \
92 - -DBUILD_SHARED_LIBS=ON \ 130 + -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \
93 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ 131 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
94 -DSHERPA_ONNX_ENABLE_TESTS=OFF \ 132 -DSHERPA_ONNX_ENABLE_TESTS=OFF \
95 -DSHERPA_ONNX_ENABLE_CHECK=OFF \ 133 -DSHERPA_ONNX_ENABLE_CHECK=OFF \
96 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ 134 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
97 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \ 135 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \
  136 + -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
98 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \ 137 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
99 -DCMAKE_INSTALL_PREFIX=./install \ 138 -DCMAKE_INSTALL_PREFIX=./install \
100 -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \ 139 -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \
101 -DANDROID_PLATFORM=android-21 .. 140 -DANDROID_PLATFORM=android-21 ..
  141 +
  142 + # By default, it links to libc++_static.a
  143 + # -DANDROID_STL=c++_shared \
  144 +
102 # make VERBOSE=1 -j4 145 # make VERBOSE=1 -j4
103 make -j4 146 make -j4
104 make install/strip 147 make install/strip
105 -cp -fv $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so install/lib 148 +cp -fv $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so install/lib 2>/dev/null || true
  149 +rm -rf install/share
106 rm -rf install/lib/pkgconfig 150 rm -rf install/lib/pkgconfig
  151 +rm -rf install/lib/lib*.a
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 set -ex 2 set -ex
3 3
4 -dir=$PWD/build-android-x86-64 4 +# If BUILD_SHARED_LIBS is ON, we use libonnxruntime.so
  5 +# If BUILD_SHARED_LIBS is OFF, we use libonnxruntime.a
  6 +#
  7 +# In any case, we will have libsherpa-onnx-jni.so
  8 +#
  9 +# If BUILD_SHARED_LIBS is OFF, then libonnxruntime.a is linked into libsherpa-onnx-jni.so
  10 +# and you only need to copy libsherpa-onnx-jni.so to your Android projects.
  11 +#
  12 +# If BUILD_SHARED_LIBS is ON, then you need to copy both libsherpa-onnx-jni.so
  13 +# and libonnxruntime.so to your Android projects
  14 +#
  15 +if [ -z $BUILD_SHARED_LIBS ]; then
  16 + BUILD_SHARED_LIBS=ON
  17 +fi
  18 +
  19 +if [ $BUILD_SHARED_LIBS == ON ]; then
  20 + dir=$PWD/build-android-x86-64
  21 +else
  22 + dir=$PWD/build-android-x86-64-static
  23 +fi
5 24
6 mkdir -p $dir 25 mkdir -p $dir
7 cd $dir 26 cd $dir
@@ -21,6 +40,9 @@ cd $dir @@ -21,6 +40,9 @@ cd $dir
21 40
22 if [ -z $ANDROID_NDK ]; then 41 if [ -z $ANDROID_NDK ]; then
23 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670 42 ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/22.1.7171670
  43 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  44 + ANDROID_NDK=/star-fj/fangjun/software/android-sdk/ndk/27.0.11718014
  45 + fi
24 # or use 46 # or use
25 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk 47 # ANDROID_NDK=/star-fj/fangjun/software/android-ndk
26 # 48 #
@@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then @@ -32,6 +54,10 @@ if [ -z $ANDROID_NDK ]; then
32 # Tools -> SDK manager -> Android SDK 54 # Tools -> SDK manager -> Android SDK
33 # and set "Android SDK location" to /Users/fangjun/software/my-android 55 # and set "Android SDK location" to /Users/fangjun/software/my-android
34 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670 56 ANDROID_NDK=/Users/fangjun/software/my-android/ndk/22.1.7171670
  57 +
  58 + if [ $BUILD_SHARED_LIBS == OFF ]; then
  59 + ANDROID_NDK=/Users/fangjun/software/my-android/ndk/27.0.11718014
  60 + fi
35 fi 61 fi
36 fi 62 fi
37 63
@@ -45,17 +71,29 @@ sleep 1 @@ -45,17 +71,29 @@ sleep 1
45 71
46 onnxruntime_version=1.17.1 72 onnxruntime_version=1.17.1
47 73
48 -if [ ! -f $onnxruntime_version/jni/x86_64/libonnxruntime.so ]; then  
49 - mkdir -p $onnxruntime_version  
50 - pushd $onnxruntime_version  
51 - wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip  
52 - unzip onnxruntime-android-${onnxruntime_version}.zip  
53 - rm onnxruntime-android-${onnxruntime_version}.zip  
54 - popd  
55 -fi 74 +if [ $BUILD_SHARED_LIBS == ON ]; then
  75 + if [ ! -f $onnxruntime_version/jni/x86_64/libonnxruntime.so ]; then
  76 + mkdir -p $onnxruntime_version
  77 + pushd $onnxruntime_version
  78 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-${onnxruntime_version}.zip
  79 + unzip onnxruntime-android-${onnxruntime_version}.zip
  80 + rm onnxruntime-android-${onnxruntime_version}.zip
  81 + popd
  82 + fi
  83 +
  84 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/x86_64/
  85 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/
  86 +else
  87 + if [ ! -f ${onnxruntime_version}-static/lib/libonnxruntime.a ]; then
  88 + wget -c -q https://github.com/csukuangfj/onnxruntime-libs/releases/download/v${onnxruntime_version}/onnxruntime-android-x86_64-static_lib-${onnxruntime_version}.zip
  89 + unzip onnxruntime-android-x86_64-static_lib-${onnxruntime_version}.zip
  90 + rm onnxruntime-android-x86_64-static_lib-${onnxruntime_version}.zip
  91 + mv onnxruntime-android-x86_64-static_lib-${onnxruntime_version} ${onnxruntime_version}-static
  92 + fi
56 93
57 -export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version/jni/x86_64/  
58 -export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version/headers/ 94 + export SHERPA_ONNXRUNTIME_LIB_DIR=$dir/$onnxruntime_version-static/lib/
  95 + export SHERPA_ONNXRUNTIME_INCLUDE_DIR=$dir/$onnxruntime_version-static/include/
  96 +fi
59 97
60 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" 98 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
61 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" 99 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"
@@ -89,20 +127,27 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -89,20 +127,27 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
89 -DBUILD_ESPEAK_NG_EXE=OFF \ 127 -DBUILD_ESPEAK_NG_EXE=OFF \
90 -DBUILD_ESPEAK_NG_TESTS=OFF \ 128 -DBUILD_ESPEAK_NG_TESTS=OFF \
91 -DCMAKE_BUILD_TYPE=Release \ 129 -DCMAKE_BUILD_TYPE=Release \
92 - -DBUILD_SHARED_LIBS=ON \ 130 + -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \
93 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \ 131 -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
94 -DSHERPA_ONNX_ENABLE_TESTS=OFF \ 132 -DSHERPA_ONNX_ENABLE_TESTS=OFF \
95 -DSHERPA_ONNX_ENABLE_CHECK=OFF \ 133 -DSHERPA_ONNX_ENABLE_CHECK=OFF \
96 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \ 134 -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
97 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \ 135 -DSHERPA_ONNX_ENABLE_JNI=$SHERPA_ONNX_ENABLE_JNI \
  136 + -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
98 -DCMAKE_INSTALL_PREFIX=./install \ 137 -DCMAKE_INSTALL_PREFIX=./install \
99 -DANDROID_ABI="x86_64" \ 138 -DANDROID_ABI="x86_64" \
100 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \ 139 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
101 -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \ 140 -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
102 -DANDROID_PLATFORM=android-21 .. 141 -DANDROID_PLATFORM=android-21 ..
103 142
  143 + # By default, it links to libc++_static.a
  144 + # -DANDROID_STL=c++_shared \
  145 +
104 # make VERBOSE=1 -j4 146 # make VERBOSE=1 -j4
105 make -j4 147 make -j4
106 make install/strip 148 make install/strip
107 -cp -fv $onnxruntime_version/jni/x86_64/libonnxruntime.so install/lib 149 +
  150 +cp -fv $onnxruntime_version/jni/x86_64/libonnxruntime.so install/lib 2>/dev/null || true
  151 +rm -rf install/share
108 rm -rf install/lib/pkgconfig 152 rm -rf install/lib/pkgconfig
  153 +rm -rf install/lib/lib*.a
1 #!/usr/bin/env bash 1 #!/usr/bin/env bash
2 set -ex 2 set -ex
3 3
  4 +if [ x$BUILD_SHARED_LIBS == xOFF ]; then
  5 + echo "BUILD_SHARED_LIBS=OFF is ignored for Android x86."
  6 + echo "Always link with libonnxruntime.so"
  7 + sleep 2
  8 +fi
  9 +
4 dir=$PWD/build-android-x86 10 dir=$PWD/build-android-x86
5 11
6 mkdir -p $dir 12 mkdir -p $dir
@@ -39,7 +39,7 @@ if(SHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION) @@ -39,7 +39,7 @@ if(SHERPA_ONNX_ENABLE_SPEAKER_DIARIZATION)
39 ) 39 )
40 endif() 40 endif()
41 41
42 -add_library(sherpa-onnx-jni ${sources}) 42 +add_library(sherpa-onnx-jni SHARED ${sources})
43 43
44 target_compile_definitions(sherpa-onnx-jni PRIVATE SHERPA_ONNX_BUILD_SHARED_LIBS=1) 44 target_compile_definitions(sherpa-onnx-jni PRIVATE SHERPA_ONNX_BUILD_SHARED_LIBS=1)
45 target_compile_definitions(sherpa-onnx-jni PRIVATE SHERPA_ONNX_BUILD_MAIN_LIB=1) 45 target_compile_definitions(sherpa-onnx-jni PRIVATE SHERPA_ONNX_BUILD_MAIN_LIB=1)