From 72e0647351f2f3de9145bccbd4779c8670ceb965 Mon Sep 17 00:00:00 2001 From: "dian.yuan" Date: Wed, 25 Feb 2026 13:43:07 +0800 Subject: [PATCH] refactor: enhance Android build scripts with dynamic example discovery and configurable ABI, and correct LLM SDK path. --- examples/LLMs/cpp/Android.mk | 2 +- examples/LLMs/cpp/CMakeLists.txt | 20 ++++---- examples/LLMs/cpp/build-android.sh | 78 +++++++++++++++++++++++++++--- examples/build-android-all.sh | 23 ++++----- 4 files changed, 92 insertions(+), 31 deletions(-) diff --git a/examples/LLMs/cpp/Android.mk b/examples/LLMs/cpp/Android.mk index ad44272..903d5d2 100644 --- a/examples/LLMs/cpp/Android.mk +++ b/examples/LLMs/cpp/Android.mk @@ -1,5 +1,5 @@ LOCAL_PATH := $(call my-dir) -LLM_SDK_PATH := $(LOCAL_PATH)/../../../../amlnn-toolkit/npu_runtime/llmsdk +LLM_SDK_PATH := $(LOCAL_PATH)/../../../../amlnn-toolkit/nn_runtime/llmsdk 3RDPARTY_PATH := $(LOCAL_PATH)/../../../dependency $(warning $(LOCAL_PATH)) diff --git a/examples/LLMs/cpp/CMakeLists.txt b/examples/LLMs/cpp/CMakeLists.txt index f72b0a4..dc16b29 100644 --- a/examples/LLMs/cpp/CMakeLists.txt +++ b/examples/LLMs/cpp/CMakeLists.txt @@ -3,14 +3,16 @@ cmake_minimum_required(VERSION 3.5.1) set(CMAKE_SYSTEM_NAME Linux) project(AML_LLM_NNSDK) -# xinxin, 后面yocto的编so的时候,如果用的cmake的话,可以把这些cmakelist.txt里面指定sysroot的都去掉, -# 然后用官方推荐的方式,source完之后它会增加很多环境变量,你可以export命令看一下,后续cmake根据环境变量自己会配置,就不用再cmakelist里面配置了 +# xinxin, when building the .so with Yocto using CMake, you can remove the sysroot settings +# from these CMakeLists.txt files and use the officially recommended approach instead: +# after sourcing the environment script, many environment variables will be set (check with `export`), +# and CMake will configure itself automatically based on them without needing explicit settings here. # source /mnt/fileroot/xinxin.he/environment/new-yocto/64/environment-setup-armv8a-poky-linux # export CXXFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g') # export CFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g') # cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} .. -# # 设置 Yocto 交叉编译环境 +# # Set Yocto cross-compilation environment # set(SYSROOT_PATH /mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/x86_64-pokysdk-linux) # set(CMAKE_SYSROOT "${SYSROOT_PATH}") # message(STATUS "Using sysroot path as ${SYSROOT_PATH}") @@ -19,7 +21,7 @@ project(AML_LLM_NNSDK) # cmake_force_c_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc" GNU) # cmake_force_cxx_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++" GNU) -# # 设置真正目标板的 sysroot +# # Set the sysroot for the actual target board # set(MYSYSROOT "/mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/armv8a-poky-linux") # add_definitions("--sysroot=${MYSYSROOT}") # set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE) @@ -29,22 +31,22 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -# SDK路径 +# SDK paths set(LLM_NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni") set(NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni/nnsdk_v2.8.1_2025_0317/lib/linux/lib64_yocto") -# 包含头文件路径 +# Include header paths include_directories( ${LLM_NNSDK_PATH} ) -# 源文件 +# Source files aux_source_directory(. SRC_LIST) -# 生成可执行文件 +# Build executable add_executable(demo_llm_yocto ${SRC_LIST}) -# 链接库 +# Link libraries target_link_libraries(demo_llm_yocto ${LLM_NNSDK_PATH}/build/libllm_nnsdk.so ${NNSDK_PATH}/libnnsdk.so diff --git a/examples/LLMs/cpp/build-android.sh b/examples/LLMs/cpp/build-android.sh index b037bf8..d537e3b 100755 --- a/examples/LLMs/cpp/build-android.sh +++ b/examples/LLMs/cpp/build-android.sh @@ -1,11 +1,75 @@ #!/bin/bash -if [ ! -d "$NDK_PATH" ]; then - echo "Error: NDK_PATH '$NDK_PATH' not found." - echo "Please set NDK_PATH environment variable to your Android NDK directory." +set -e + +# +# Copyright (C) 2024-2025 Amlogic, Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +usage() { + echo "Usage: $0 [-a ]" + echo " -a : Target ABI (default: arm64-v8a)" + echo " -h : Show this help message" exit 1 +} + +# Default values +TARGET_ABI=arm64-v8a + +# Parse arguments +while getopts 'a:h' opt; do + case "$opt" in + a) + TARGET_ABI=$OPTARG + ;; + h) + usage + ;; + *) + usage + ;; + esac +done + +if [ -z "${ANDROID_NDK_PATH}" ]; then + if [ -n "${ANDROID_NDK}" ]; then + ANDROID_NDK_PATH=${ANDROID_NDK} + elif [ -n "${ANDROID_NDK_HOME}" ]; then + ANDROID_NDK_PATH=${ANDROID_NDK_HOME} + else + echo "Error: ANDROID_NDK_PATH is not set." + echo "Please set ANDROID_NDK_PATH to your Android NDK directory." + exit 1 + fi fi -$NDK_PATH/ndk-build \ - NDK_PROJECT_PATH=. \ - APP_BUILD_SCRIPT=./Android.mk \ - NDK_APPLICATION_MK=./Application.mk +ROOT_PWD=$(cd "$(dirname $0)" && pwd) +BUILD_DIR=${ROOT_PWD}/build/android + +echo "Building LLMs for Android (ndk-build)..." +echo "NDK_PATH: ${ANDROID_NDK_PATH}" +echo "TARGET_ABI: ${TARGET_ABI}" +echo "BUILD_DIR: ${BUILD_DIR}" + +mkdir -p ${BUILD_DIR} + +${ANDROID_NDK_PATH}/ndk-build \ + NDK_PROJECT_PATH="${ROOT_PWD}" \ + APP_BUILD_SCRIPT="${ROOT_PWD}/Android.mk" \ + NDK_APPLICATION_MK="${ROOT_PWD}/Application.mk" \ + NDK_OUT="${BUILD_DIR}/obj" \ + NDK_LIBS_OUT="${BUILD_DIR}/libs" \ + APP_ABI="${TARGET_ABI}" + +echo "Build complete. Libs in ${BUILD_DIR}/libs" diff --git a/examples/build-android-all.sh b/examples/build-android-all.sh index f273101..6b7ba07 100755 --- a/examples/build-android-all.sh +++ b/examples/build-android-all.sh @@ -84,20 +84,15 @@ echo "NDK_PATH: ${ANDROID_NDK_PATH}" echo "TARGET_ABI: ${TARGET_ABI}" echo "============================================" -# List all examples that have a build-android.sh -EXAMPLES=( - "clip/cpp" - "mobilenet/cpp" - "ppocr-det/cpp" - "resnet/cpp" - "retinaface/cpp" - "whisper/cpp" - "yoloe/cpp" - "yolov11/cpp" - "yolov8/cpp" - "yoloworld/cpp" - "yolox/cpp" -) +# Dynamically discover all examples that have a build-android.sh +mapfile -t BUILD_SCRIPTS < <(find "${SCRIPT_DIR}" -mindepth 3 -maxdepth 3 -name "build-android.sh" | sort) + +EXAMPLES=() +for script in "${BUILD_SCRIPTS[@]}"; do + # Convert absolute path to a path relative to SCRIPT_DIR (e.g. "yolov8/cpp") + rel=$(realpath --relative-to="${SCRIPT_DIR}" "$(dirname "$script")") + EXAMPLES+=("$rel") +done FAILED=() SUCCEEDED=()