【操作記錄】MNN Chat Android App 構建筆記(二)

📒 MNN Chat Android App 構建筆記

一、背景知識

  1. MNN 簡介

    • MNN 是阿里開源的輕量級深度學習框架,支持 Android / iOS / Linux / Windows。
    • 提供推理、LLM、Vision、Audio 等模塊。
    • Android App 里用到的是 Java + JNI 調用 MNN 庫
  2. CMake + NDK 的作用

    • CMake:跨平臺構建工具,用于生成工程文件(Makefile / Ninja)。
    • NDK:Android 原生開發工具包,提供交叉編譯環境,把 C++ 源碼編譯成 .so 庫。
    • Gradle:Android Studio 的構建系統,最終把 .so 打包到 APK。
  3. 構建的兩部分

    • MNN 主庫 (libMNN.so):用 CMake + NDK 編譯。
    • MnnLlmChat App:用 Android Studio (Gradle) 構建,依賴上面生成的 libMNN.so

二、官方推薦步驟

MNN 官方文檔的流程(apps/Android/MnnLlmChat/README.md 里給出):

  1. 編譯 MNN 主庫

    cd project/android
    mkdir build_64
    ../build_64.sh "-DMNN_BUILD_LLM=true -DMNN_OPENCL=true ..."
    make install
    
    • 輸出:libMNN.so
  2. 打開 Android App 工程

    • 路徑:apps/Android/MnnLlmChat/
    • 用 Android Studio 打開,Gradle 會自動拉依賴。
    • 連接 Android 手機,運行 Run app

三、我的操作過程

1. 初次嘗試:跟隨官方步驟

cd project/android
mkdir build_64
../build_64.sh "-DMNN_BUILD_LLM=true ..."
make install

? 報錯:

Could not find toolchain file: D:/Git/build/cmake/android.toolchain.cmake
CMake Error: CMAKE_C_COMPILER not set

原因

  • 系統環境找不到 Android NDK 的路徑(腳本默認路徑不對)。
  • Windows 下 make 也不可用。

2. 修改后嘗試:手動 CMake

export ANDROID_NDK=/d/sdk/ndk/27.2.12479018
cmake .. -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake ...

? 報錯:

The source directory "project/android" does not appear to contain CMakeLists.txt

原因

  • project/android 目錄下運行,但 CMakeLists.txt項目根目錄

3. 正確構建方式

cd /g/down/MNN-master/MNN-master
mkdir -p build_64
cd build_64cmake .. -G Ninja \-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-33 \-DMNN_BUILD_LLM=true \-DMNN_OPENCL=true \-DMNN_ARM82=true \-DMNN_USE_LOGCAT=true \-DMNN_BUILD_OPENCV=true \-DLLM_SUPPORT_VISION=true \-DLLM_SUPPORT_AUDIO=trueninja install

? 成功輸出:build_64/lib/libMNN.so


4. Android Studio 部分

  • 打開 apps/Android/MnnLlmChat/
  • 等待 Gradle 下載依賴(可能比較慢,需要網絡)
    在這里插入圖片描述
    在這里插入圖片描述在這里插入圖片描述
    在這里插入圖片描述

?? 遇到的錯誤:

Unknown host 'repo.maven.apache.org'

原因:網絡問題,無法下載依賴。
解決

  • 關掉 Gradle 的 offline mode
  • 確保網絡能訪問 repo.maven.apache.org(必要時開代理)

后續 Gradle 下載 kotlin-compiler-embeddable 包時:

Downloading kotlin-compiler-embeddable-2.1.21.jar (56MB)

這是 正常的依賴下載過程


四、報錯與解決總結

步驟報錯原因解決
build_64.sh找不到 toolchain.cmake默認路徑不對設置 ANDROID_NDK 環境變量
cmake …沒有 CMakeLists.txt路徑選錯必須在 項目根目錄 執行
make找不到 makeWindows 下沒有 GNU MakeNinja
Gradle syncUnknown host網絡問題配置代理,關閉 offline mode
Gradle buildkotlin-compiler 下載很慢包很大 (56MB)等待即可

五、最終全流程總結

  1. 準備環境

    • Android NDK: D:\sdk\ndk\27.2.12479018
    • CMake: D:\sdk\cmake\3.22.1\bin
    • Ninja: 已安裝 (ninja --version 正常)
  2. 編譯 MNN 主庫

    cd /g/down/MNN-master/MNN-master
    mkdir -p build_64 && cd build_64cmake .. -G Ninja \-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-33 \-DMNN_BUILD_LLM=true \-DMNN_OPENCL=true \-DMNN_ARM82=true \-DMNN_USE_LOGCAT=true \-DMNN_BUILD_OPENCV=true \-DLLM_SUPPORT_VISION=true \-DLLM_SUPPORT_AUDIO=trueninja install
    

在這里插入圖片描述
最后失敗了
在這里插入圖片描述
遇到的是 鏈接階段報錯,編譯 .o 文件都成功了,但是在 生成可執行文件 時失敗了:

clang++: error: linker command failed with exit code 1
ninja: build stopped: subcommand failed.

結合日志可以看到,它失敗的位置大概在這里:

[748/766] Linking CXX executable OpenCLProgramBuildTest.out
...
[756/766] Linking CXX executable timeProfile.out

為什么會失敗?

MNN 的 CMakeLists.txt 默認會編譯很多 測試用的可執行文件(比如 timeProfile.out, testModel.out,這些都是 PC/Linux 下測試 MNN 用的,不是 Android 必須的)。

但是我現在的目標是 交叉編譯到 Android,這些可執行文件在 Android NDK 下是沒法正常鏈接的(因為它們需要 main(),還依賴 host 庫),所以鏈接失敗。


? 解決方法

只需要 構建 so 庫,而不是這些測試程序。

在 CMake 配置時加上:

-DBUILD_TEST=OFF -DMNN_BUILD_TEST=OFF

完整命令變成:

cmake .. -G Ninja \-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-33 \-DMNN_LOW_MEMORY=true \-DMNN_CPU_WEIGHT_DEQUANT_GEMM=true \-DMNN_BUILD_LLM=true \-DMNN_SUPPORT_TRANSFORMER_FUSE=true \-DMNN_ARM82=true \-DMNN_USE_LOGCAT=true \-DMNN_OPENCL=true \-DLLM_SUPPORT_VISION=true \-DMNN_BUILD_OPENCV=true \-DBUILD_TEST=OFF \-DMNN_BUILD_TEST=OFF

然后重新執行:

ninja install

在這里插入圖片描述

編譯結果

這樣就不會去編譯那些 xxxTest.outxxxProfile.out,只會輸出核心庫:

  • build_64/lib/libMNN.so
  • build_64/lib/libMNN_Express.so

這些 .so 文件才是在 Android App 里要用的。
在這里插入圖片描述


  1. 構建 Android App

    • 打開 apps/Android/MnnLlmChat/
    • Gradle 自動拉依賴(需要聯網)
    • 連接手機,點擊 Run
      在這里插入圖片描述遇到的錯誤是典型的 Android Studio + CMake/Ninja 找不到預編譯的 libMNN.so 錯誤:
ninja: error: '../../../../../../../../project/android/build_64/lib/libMNN.so', 
needed by '.../libmnn_tts.so', missing and no known rule to make it

意思是:

  1. libmnn_tts.so 依賴 libMNN.so
  2. Ninja/Gradle 想在路徑 project/android/build_64/lib/libMNN.so 找到它,但實際沒有
  3. 因為 CMake 沒有生成 .so 或者生成路徑不對,所以報錯。

🔑 原因分析

  1. 可能沒有把 MNN 編譯成 Android 庫(或者編譯失敗了,參考你之前的鏈接報錯)。
  2. 或者 CMake 輸出路徑不對,默認可能在 build_64/lib/build_64/install/lib/
  3. 或者測試程序編譯失敗導致 Ninja 中斷,所以 .so 沒生成。

? 解決方案

1?? 重新配置 CMake,只生成 Android 庫

project/android/build_64 里:

cmake .. -G Ninja \-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \-DANDROID_ABI=arm64-v8a \-DANDROID_PLATFORM=android-33 \-DMNN_LOW_MEMORY=true \-DMNN_CPU_WEIGHT_DEQUANT_GEMM=true \-DMNN_BUILD_LLM=true \-DMNN_SUPPORT_TRANSFORMER_FUSE=true \-DMNN_ARM82=true \-DMNN_USE_LOGCAT=true \-DMNN_OPENCL=true \-DLLM_SUPPORT_VISION=true \-DMNN_BUILD_OPENCV=true \-DBUILD_TEST=OFF \-DMNN_BUILD_TEST=OFF

重點:BUILD_TEST=OFF + MNN_BUILD_TEST=OFF 確保不會去編譯 PC 測試程序導致中斷。
在這里插入圖片描述

2?? 編譯安裝
ninja install

在這里插入圖片描述
遇到的錯誤是 LLM 模塊在編譯 Android 共享庫 libllm.so 時鏈接失敗,報錯信息:

undefined symbol: MNN::CV::imread(std::__ndk1::basic_string<char, ...> const&, int)
referenced by omni.cpp:557

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919749.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在 Axios 中處理多個 baseURL 而不造成混亂

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

AP服務發現PRS_SOMEIPSD_00255 的解析

[PRS_SOMEIPSD_00255 ] 「SOME/IP-SD頭部的重啟標志&#xff0c;對于重啟后發出的所有報文&#xff0c;都應設置為 1&#xff0c;直至 SOME/IP頭部中的會話 ID (Session-ID) 回繞并因此再次從 1 開始。在此回繞之后&#xff0c;重啟標志應設置為 0。」(RS_SOMEIPSD_00006)核心含…

純手擼一個RAG

純手擼一個RAGRAG基本流程第一階段&#xff1a;數據預處理&#xff08;索引&#xff09; - 構建知識庫第二階段&#xff1a;查詢與生成&#xff08;推理&#xff09; - 回答問題總結Chunk介紹Chunk框架的介紹Chunk核心概念選擇分塊策略和框架如何選擇分塊框架Python代碼實現第一…

視覺語言對比學習的發展史:從CLIP、BLIP、BLIP2、InstructBLIP(含MiniGPT4的詳解)

前言 本文一開始是屬于此文《圖像生成(AI繪畫)的發展史&#xff1a;從CLIP、BLIP、InstructBLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion(含ControlNet詳解)》的&#xff0c;后獨立成本文 第一部分 從CLIP、BLIP1、BLIP2到InstructBLIP 1.1 CLIP&#xff1a;基于對比文本…

HTTP代理與SOCKS代理的區別、應用場景與選擇指南

在互聯網日常使用與跨境業務中&#xff0c;HTTP代理 和 SOCKS代理 是兩種常見的網絡代理方式。無論是跨境電商、社交媒體賬號運營、數據采集&#xff0c;還是科學訪問海外資源&#xff0c;都需要選擇合適的代理協議。什么是HTTP代理&#xff1f;定義HTTP代理 是基于 HTTP協議 的…

AI重塑職業教育:個性化學習計劃提效率、VR實操模擬強技能,對接就業新路徑

職業教育長期面臨著一系列問題&#xff0c;包括“統一課程難以適配不同基礎學員”、“實操反饋滯后”和“就業技能與企業需求脫節”等。隨著人工智能技術的應用&#xff0c;這些傳統教學模式正在發生變化。個性化技能培養得以實現&#xff0c;甚至可以提前識別學員的就業短板。…

主題配色下的背景透明度

用 CSS color-mix() 解決背景透明度的痛點 在設計卡片組件時&#xff0c;經常遇到這樣的需求&#xff1a;卡片背景需要80%透明度&#xff0c;鼠標懸浮在內部某項時&#xff0c;修改背景色但保持同樣的透明度。 問題場景 .card {background: rgba(59, 130, 246, 0.8); /* 藍色80…

【Python代碼】谷歌專利CSV處理函數

以下是一個重構后的高可用、可配置、低耦合的專利CSV處理函數&#xff0c;包含清晰的注釋和結構&#xff1a; import csv import pandas as pd from datetime import datetime import os from typing import List, Dict, Any, Optional, Tuple import logging# 配置日志 loggin…

3-2〔OSCP ? 研記〕? WEB應用攻擊?WEB安全防護體系

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

PCIe 5.0相比頂級PCIe 4.0有何提升?

還在為PCIe 4.0固態硬盤那7000MB/s的速度沾沾自喜&#xff1f;醒醒&#xff0c;朋友。當很多人還在討論PCIe 4.0是否“性能過剩”時&#xff0c;真正面向未來的PCIe 5.0已經帶著碾壓級的實力&#xff0c;來到了我們面前。這不是一次常規的“升級”&#xff0c;更不是英特爾式的…

23種設計模式——適配器模式(Adapter)?詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a; 設計模式 ?特色專欄&#xff1a; 知識分享 &…

Vue3源碼reactivity響應式篇之Reactive

概覽 vue3中reactive用于將普通對象轉換為響應式對象&#xff0c;它的實現原理是通過Proxy和Reflect來實現的。具體的實現文件參見packages\reactivity\src\reactive.ts。本文會介紹reactive的相關api如下&#xff1a; reactive&#xff1a;將普通對象轉換為響應式對象readonly…

初識數據結構——Map和Set:哈希表與二叉搜索樹的魔法對決

數據結構專欄 ?(click) 大家好&#xff01;我是你們的老朋友——想不明白的過度思考者&#xff01;今天我們要一起探索Java中兩個神奇的數據結構&#xff1a;Map和Set&#xff01;準備好了嗎&#xff1f;讓我們開始這場魔法之旅吧&#xff01;&#x1f3a9; &#x1f3af; 先…

Unreal Engine UStaticMeshComponent

UnrealUnreal Engine - UStaticMeshComponent&#x1f3db; 定義&#x1f3db; 類繼承? 關鍵特性?? 常見配置&#x1f6e0;? 使用方法&#x1f4da; 在 C 中使用&#x1f4da; 在藍圖中使用&#x1f3ae; 典型應用場景&#x1f4da; 常見子類與用途&#x1f4dd; 小結Unrea…

demo 汽車之家(渲染-篩選-排序-模塊抽離數據)

效果圖展示&#xff1a;代碼截圖注釋詳情實現筆記總體目標&#xff08;按需求點對照代碼&#xff09;數據模塊化、整體渲染框架、篩選/排序的高亮與行為&#xff0c;全部已在 Index.ets CarData.ets 落地。下面按圖片需求 2~4 點逐條總結&#xff0c;并給出關鍵代碼定位與“為…

雙重機器學習DML介紹

本文參考&#xff1a; [1]文心一言回答&#xff1b; 一、核心原理與數學框架 雙重機器學習&#xff08;Double Machine Learning, DML&#xff09;由Chernozhukov等學者于2018年提出&#xff0c;是一種結合機器學習與傳統計量經濟學的因果推斷框架。其核心目標是在高維數據和非…

【圖像算法 - 21】慧眼識蟲:基于深度學習與OpenCV的農田害蟲智能識別系統

摘要&#xff1a; 在現代農業生產中&#xff0c;病蟲害是影響作物產量和品質的關鍵因素之一。傳統的害蟲識別依賴人工巡查&#xff0c;效率低、成本高且易出錯。本文將介紹如何利用深度學習與OpenCV構建一套高效的農田害蟲智能識別系統。該系統能夠自動識別10類常見農業害蟲&a…

循環神經網絡實戰:GRU 對比 LSTM 的中文情感分析(三)

循環神經網絡實戰&#xff1a;GRU 對比 LSTM 的中文情感分析&#xff08;三&#xff09; 文章目錄循環神經網絡實戰&#xff1a;GRU 對比 LSTM 的中文情感分析&#xff08;三&#xff09;前言數據準備&#xff08;與 LSTM 相同&#xff09;模型搭建&#xff08;GRU&#xff09;…

學習游戲制作記錄(制作提示框以及使用鍵盤切換UI)8.21

1.制作裝備提示框創建提示框&#xff0c;添加文本子對象&#xff0c;用來描述名稱&#xff0c;類型以及屬性加成掛載垂直分配組件和文本大小適配組件&#xff0c;這樣圖像會根據文本大小來調整自己創建UI_ItemTip腳本并掛載在文本框上&#xff1a;[SerializeField] private Tex…

chapter07_初始化和銷毀方法

一、簡介 一個Bean&#xff0c;在進行實例化之后&#xff0c;需要進行兩種初始化 初始化屬性&#xff0c;由PropertyValues進行賦值初始化方法&#xff0c;由ApplicationContext統一調用&#xff0c;例如加載配置文件 Bean的初始化與銷毀&#xff0c;共有三種方式&#xff08;注…