尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

llama.cpp用Android NDK编译成so动态库,Kotlin通过JNI调用

llama.cpp用Android NDK编译成so动态库,Kotlin通过JNI调用 llama.cpp用Android NDK编译成so动态库,Kotlin通过JNI调用摘要:在Android应用中通过Kotlin调用llama.cpp模型的完整方案。主要内容包括:两种实现方案对比:推荐使用Android Studio+CMake+NDK的集成方案,优于单独编译.so的方式。技术架构:Kotlin负责UI层,通过JNI调用C++封装的llama.cpp接口,模型文件存储在本地。关键实现步骤:NDK和CMake环境配置llama.cpp作为子模块集成CMakeLists.txt配置优化JNI接口设计(初始化、推理、释放等)Kotlin与C++的数据交互性能优化建议:仅支持arm64-v8a架构合理设置上下文长度和线程数模型文件管理策略内存和线程注意事项常见问题解决方案和推荐实现路线。方案实现了在移动端高效运行大语言模型,支持流式输出和中断生成,适用于需要本地AI能力的Android应用开发。把 llama.cpp 用 Android NDK 编译成.so原生动态库,然后在 Kotlin 里通过 JNI 调用它。整体调用链是:Kotlin / Android UI ↓ JNI 接口层 ↓ 你自己写的 C++ Wrapper ↓ llama.cpp ↓ 本地 GGUF 模型文件也就是:Kotlin 负责界面、输入、流式显示 C++ 负责调用 llama.cpp 推理 GGUF 模型文件放在手机本地一、总体方案在 Android 里调用 llama.cpp,一般有两种方式。方案一:Android Studio + CMake + NDK 编译这是最推荐的方式。目录大概是:app/ ├── build.gradle └── src/ └── main/ ├── java/com/example/localai/ │ └── LlamaNative.kt ├── cpp/ │ ├── CMakeLists.txt │ ├── llama_jni.cpp │ └── llama.cpp/ │ ├── CMakeLists.txt │ ├── include/ │ ├── src/ │ └── ggml/ └── AndroidManifest.xml编译后会生成:libllama_jni.so这个.so会被打包进 APK/AAB。Kotlin 通过:System.loadLibrary("llama_jni")加载它。方案二:命令行单独编译.so,再放入 jniLibs也可以先用 NDK 命令行编译出.so,然后放到:app/src/main/jniLibs/arm64-v8a/比如:app/src/main/jniLibs/arm64-v8a/libllama.so app/src/main/jniLibs/arm64-v8a/libllama_jni.so但这个方式后期维护不如 Android Studio + CMake 方便。所以建议首选:Android Studio + CMake + NDK + JNI Wrapper。二、关键点:Kotlin 不能直接调用 llama.cppllama.cpp是 C/C++ 项目。Kotlin/Java 不能直接调用 C++ 函数,所以需要中间加一层 JNI。整体结构如下:Kotlin ↓ external native 方法 JNI C++ Wrapper ↓ 调用 llama.cpp C API llama.cpp ↓ 读取 GGUF 模型 本地推理需要自己写一个类似:llama_jni.cpp的文件,把 llama.cpp 的初始化、加载模型、生成文本、释放模型封装给 Kotlin 使用。三、准备 Android NDK 和 CMake在 Android Studio 里安装:NDK CMake LLDB,可选路径:Android Studio ↓ Settings ↓ Languages Frameworks ↓ Android SDK ↓ SDK Tools ↓ 勾选: - NDK - CMake建议:NDK r26 以上 更推荐较新的 NDK r27/r28+原因是新版本对 Android 新系统、16KB page size 等兼容更好。四、把 llama.cpp 加入 Android 工程可以作为 Git submodule:cd app/src/main/cpp git submodule add https://github.com/ggml-org/llama.cpp llama.cpp如果这个地址变动,也可以用:git submodule add https://github.com/ggerganov/llama.cpp llama.cpp推荐固定一个 llama.cpp commit,不要一直跟最新主分支。因为 llama.cpp 的 C API 会变化。例如:cd app/src/main/cpp/llama.cpp git checkout 某个稳定commit五、Gradle 配置在app/build.gradle或app/build.gradle.kts中开启 CMake。Groovy 版本示例android { namespace 'com.example.localai' compileSdk 35 defaultConfig { applicationId "com.example.localai" minSdk 26 targetSdk 35 externalNativeBuild { cmake { cppFlags "-std=c++17 -O3" } } ndk { abiFilters "arm64-v8a" } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" version "3.22.1" } } }建议首版只支持:arm64-v8a原因:1. 现代 Android 手机基本都是 64 位 2. llama.cpp 推理更适合 arm64 3. 减少包体 4. 避免 32 位内存限制不建议支持:armeabi-v7a六、CMakeLists.txt 示例文件路径:app/src/main/cpp/CMakeLists.txt示例:cmake_mini
返回列表