3588开发板大模型apk开发

发布时间:2026/7/1 23:51:13

3588开发板大模型apk开发 硬件Windows11电脑Linux服务器3588Android12开发板软件vscodeAndroid studioadb目录模型下载模型转换为RKLLM格式Linux服务器端APK开发Windows PC端连接开发板并调试方法一在Android studio中选择3588开发板进入调试​编辑方法二也可以通过adb命令直接安装在板子推荐方法一补充理解这些文件间的关系模型下载模型链接Qwen3-1.7b-医疗微调微调 · 模型库通过modelscope工具下载到服务器上pip install modelscope #下载工具包进入目标下载目录下载模型到当前目录modelscope download --model testUser/Qwen3-1.7b-Medical-R1-sft model.safetensors --local_dir .最终下载的文件 也可以直接拉取整个文件夹到目标目录下模型转换为RKLLM格式Linux服务器端RKLLM-Toolkit 支持将 Hugging Face 格式模型转为 RK3588 适配的.rkllm格式核心是「加载→校准→量化→编译→打包」。https://modelscope.cn/models/testUser/Qwen3-1.7b-Medical-R1-sft/file/view/master/model.safetensors?status2 这个格式模型是SafeTensors格式是Hugging Face的。1.准备量化校准数据dataset.json量化需要少量真实数据来校准精度。由于是医疗模型放入一些医疗相关的问题。 在模型转换目录下创建 dataset.json[ {input: 你可以帮我写一份病历吗, target: 当然可以请提供患者的症状。}, {input: 感冒了应该吃什么药, target: 建议多喝水可以服用感冒灵。}, {input: 什么是高血压, target: 高血压是一种常见的心血管疾病。}, {input: 肚子疼怎么办, target: 请详细描述疼痛的位置和持续时间。}, {input: 头痛医头脚痛医脚是什么意思, target: 这是一个成语指只做表面文章。} ]2.编写转换脚本 脚本流程 加载 - 试跑(校准) - 压缩(量化) - 翻译(编译) - 打包 参考官方rknn-llm/doc/Rockchip_RKLLM_SDK_CN_1.2.3.pdf at main · airockchip/rknn-llm3.运行转换脚本python convert_qwen3_medical_w8a8.py# 确保RKLLM-Toolkit已安装参考官方文档 pip install rknn-llm1.2.3 # 执行转换 python convert_qwen3_medical_w8a8.py4.交叉编译demo验证模型可用性推送文件到板子上并赋予权限运行APK开发Windows PC端下载安装Android Studio1.创建 Native C 项目打开 Android Studio新建项目→选择「Native C」→下一步配置项目名称qwen3_medical包名com.example.qwen3_medical语言Java最小 SDKAndroid 12API 31C 标准C17完成创建自动生成基础工程结构。2.集成 RKLLM Runtime 资源https://github.com/airockchip/rknn-llm/tree/main在app/src/main下新建jniLibs/arm64-v8a目录将 RKLLM SDK 中的librkllmrt.solibomp.so路径rkllm-runtime/Android/arm64-v8a/复制到该目录。复制 RKLLM 头文件rkllm.h到app/src/main/cpp目录与native-lib.cpp 同目录项目结构如下图3.配置 CMakeLists.txt这个文件告诉编译器去哪里找 rkllmrt.so 和 libomp.so 这些工具然后将它们和 native-lib.cpp 链接到一起cmake_minimum_required(VERSION 3.22.1) project(qwen3_medical) # 1. 导入预编译的 librkllmrt.so add_library(rkllmrt SHARED IMPORTED) set_target_properties(rkllmrt PROPERTIES # 路径对应你的文件结构从cpp目录向上到main再进入jniLibs/arm64-v8a IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/arm64-v8a/librkllmrt.so ) # 2. 导入预编译的 libomp.so add_library(libomp SHARED IMPORTED) set_target_properties(libomp PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/arm64-v8a/libomp.so ) # 3. 编译当前项目的C源码为动态库 add_library(${CMAKE_PROJECT_NAME} SHARED native-lib.cpp ) # 4. 链接所有依赖库到目标库 target_link_libraries(${CMAKE_PROJECT_NAME} # 刚才导入的两个预编译库 rkllmrt libomp # 系统基础库 android log )配置段作用add_library(rkllmrt SHARED IMPORTED)声明导入外部预编译的 librkllmrt.so而非编译新库IMPORTED_LOCATION指定 so 库的实际路径${CMAKE_SOURCE_DIR}是当前 CMakeLists.txt 所在目录target_link_libraries将所有依赖库链接到项目的动态库中确保运行时能调用到 RKLLM 的函数CMakeLists.txt 修改完成后需同步配置点击顶部菜单栏的 File → Sync Project with Gradle Files或点击右上角的「大象 刷新」图标等待同步完成若控制台无「CMake 配置错误」「找不到 so 文件」等提示说明基础配置生效4..配置build.gradle.kts确保 Android Studio仅编译 arm64-v8a 架构的 so 库否则它可能尝试构建 x86 版本但找不到对应的 .so 库而报错。打开 app/build.gradle.kts (或 build.gradle)确保有以下配置强制 APK 只包含 64 位 ARM 代码android { // ... 其他配置 defaultConfig { // ... externalNativeBuild { cmake { cppFlags() // 强制指定只编译 64位 ARM 架构 abiFilters(arm64-v8a) } } ndk { // 打包 APK 时只包含 arm64-v8a 的库 abiFilters arm64-v8a } } }5.编写 C JNI (native-lib.cpp)层代码JNI 层是 Java 与 C 的 “桥梁”让 Java 层MainActivity能调用 C/C 写的底层功能如项目中要调用 RKLLM 模型的加载、推理。rkllm.h 这是瑞芯微官方提供的头文件。相当于说明书规定了可以使用哪些功能、需要传入什么参数、结构体长什么样。它是标准不能修改。native-lib.cpp 必须严格遵守 rkllm.h 的定义函数名、参数类型否则会报错。6.编写 Java 层逻辑 (MainActivity.java)注意其中的module path 路径需为开发板上真实的模型路径需将模型上传到开发板此路径下7.编写UI布局activity_main.xml需确保控件的 ID 和 Java 代码里的一致连接开发板并调试开发板连接网络并进入开发者模式打开开发板的无线调试和网络adb调试。通过adb工具连接到开发板方法一在Android studio中选择3588开发板进入调试点击 Android Studio 顶部 Run运行项目 。打开 Logcat在 Android Studio 底部栏打开 Logcat 标签页。在 Logcat 的搜索框里输入RKLLM_JNI (这是在 C 代码里定义的日志标签)。可以看到模型初始化成功开发板连接显示器可在桌面上看到应用并正常对话交互方法二也可以通过adb命令直接安装在板子推荐方法一点击generate apks在下方可看到build output项目路径下查看生成的apk文件 通过adb窗口install之后可以开发板连接显示器双击桌面的apk运行并可在PC机cmd命令行中通过logcat命令查看日志。补充理解这些文件间的关系┌─────────────────────────────────────────────────────────────────┐ │ 层级 │ 核心文件 │ 核心职责 │ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ UI层 │ activity_main.xml │ 定义界面布局控件、样式 │ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ Java业务层 │ MainActivity.java │ 处理UI交互、调用JNI、管理对话逻辑 │ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ JNI桥接层 │ native-lib.cpp rkllm.h │ 连接Java与C调用RKLLM接口 │ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ RKLLM运行时 │ librkllmrt.so libomp.so │ 提供NPU加速推理的底层实现 │ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ 模型文件 │ qwen3_medical_rk3588_w8a8.rklm │ 医疗模型的权重与编译指令NPU可执行│ ├──────────────┼─────────────────────────────────────────────┼─────────────────────────────────┤ │ 编译配置层 │ CMakeLists.txt app/build.gradle │ 控制代码编译、依赖链接、APK打包 │ └─────────────────────────────────────────────────────────────────┘1.Java 层负责 UI 交互调用 JNI 接口实现多轮对话逻辑调用 C 的 initModel 和 chat 接口。接收 C 回调回来的文字显示在屏幕上。负责拼接历史对话Prompt Engineering保证多轮对话连贯。RKLLM 的 chat 接口是无状态的。要实现多轮对话需要在 Java 里把历史对话拼接到一起多轮对话状态维护在 Java 层维护一个 StringBuilder promptBuilder。用户发消息 - promptBuilder.append(用户格式)。调用推理 - 模型生成文本 - 存入 currentAiResponse。推理结束 - promptBuilder.append(currentAiResponse IM_END)。下一轮- 再次发送整个 promptBuilder.toString()。2.native-lib.cpp 的核心作用让 Java 能调用 C 函数正向调用让 C 能回调 Java 方法反向调用完成跨语言的数据类型转换封装底层 C 库的调用逻辑屏蔽 RKLLM 的复杂接口。我们可以把开发这个 App 比作“开一家餐厅”build.gradle.kts (总管/施工队队长)作用它负责指挥整个编译过程。它告诉编译器“我们要造一个 Android App请把 Java 代码编译好然后去调用 CMake 把 C 代码也编译好最后打包成一个 APK 安装包。”.so 库只有arm64-v8a(RK3588 专用) 的版本。如果不告诉总管“只做 arm64 的菜”总管默认会尝试做 x86电脑模拟器或 32位 ARM 的菜结果发现没有配料就会报错。CMakeLists.txt (后厨装修图纸)作用它告诉 C 编译器“去哪里找 rkllmrt.so 和 libomp.so 这些工具然后把它们和 native-lib.cpp 焊接到一起。”native-lib.cpp (后厨大厨/翻译官)作用这是连接 Java (前台) 和 .so 库 (核心引擎) 的桥梁。Android Studio 生成的默认代码只会说一句 “Hello from C”。需要把它删掉重写成调用 RKLLM 模型初始化、推理、对话的代码。如果不改App 虽然能运行但没有任何 AI 功能。MainActivity.java (前台服务员/菜单)作用负责把用户的输入菜单传给后厨并把后厨做好的结果AI 回复端给用户看。需要在这里写逻辑去调用 native-lib.cpp 里的函数。

相关新闻