找回密码
 立即注册
查看: 560|回复: 20

手机APP工具开发指南--安卓篇,手机的USB-OTG 和 Ai8051U 通信

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:45:56 | 显示全部楼层 |阅读模式
手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信,效果展示:

手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信


安装包:
jdk-17.0.14_windows-x64_bin.exe (153.99 MB, 下载次数: 10)
gradle-8.11.1-bin.zip (130.58 MB, 下载次数: 10)
android-studio-2024.3.1.13-windows.exe 太大无法上传,自行在android studio官网下载最新版本
可直接使用的固件:
app-usb.apk (6.75 MB, 下载次数: 26)
Ai8051U-32bit-24M.hex (29.14 KB, 下载次数: 7)
工程源码:
apk: MyApplication-USB.zip (30.61 MB, 下载次数: 15)
擎天柱固件: Ai8051U-Firmware.zip (337.92 KB, 下载次数: 8)


==============================================================================
一、环境安装
注意不要安装在VM等虚拟机里,否则可能无法使用安卓模拟器。

1. 安装JDK
截图202503211520579260.jpg

配置环境变量
这里用的默认路径,按照自己的路径配置即可。

JAVA_HOME C:\Program Files\Java\jdk-17

截图202503211521276616.jpg

配置path:
%JAVA_HOME%\bin

截图202503211521461567.jpg
截图202503211521573931.jpg
测试是否安装成功:
java -version
截图202503211522201236.jpg

三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:45:57 | 显示全部楼层
2. 拷贝gradle
gradle正常是Android Studio自动联网下载的,下载不了可以设置本地路径
拷贝压缩包就行,不需要解压。路径中最好不要有中文或空格等特殊字符
截图202503211522594819.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:45:58 | 显示全部楼层
3. 安装Android Studio

除了安装路径自定义,其它默认下一步即可。
截图202503211523473590.jpg
截图202503211523547581.jpg
截图202503211524047968.jpg



三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:45:59 | 显示全部楼层
4. 安装sdk
启动Android Studio
截图202503211524326363.jpg
下面这里点cancel即可
截图202503211524519228.jpg
自定义sdk放置路径选custom(注意SDK需要空间较大,几十GB级别)
截图202503211525062842.jpg
安装sdk和虚拟机
截图202503211525221523.jpg
点Accept,Finish等待下载完成
截图202503211525466340.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:00 | 显示全部楼层
二、新建项目

截图202503211526215988.jpg
选择Empty Views Activity(注意第二个项目默认只有Kotlin语言不要选错,下文用java项目示例):
截图202503211526355468.jpg
项目配置选择(注意默认Kotlin语言,楼主这里选java):
截图202503211526495978.jpg
等待ide初始化完成。弹出adb联网请求允许即可。
截图202503211527061732.jpg
这里部分网络环境不好的会报错,改用本地gradle路径即可。
distributionUrl=file:///E:/env/gradle-8.11.1-bin.zip
截图202503211527332002.jpg


点击try again,等待gradle下载依赖文件(时间较长,耐心等待)

下载报错或者太慢的,可以点左下角🔨->红色方框停止,然后修改项目根目录settigns.gradle配置阿里maven源:

截图202503211527503195.jpg
截图202503211527564900.jpg
  1. pluginManagement {
  2.     repositories {
  3.         maven {url 'https://maven.aliyun.com/repository/google'}
  4.         maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
  5.         maven {url 'https://maven.aliyun.com/repository/public'}
  6.         google {
  7.             content {
  8.                 includeGroupByRegex("com\\.android.*")
  9.                 includeGroupByRegex("com\\.google.*")
  10.                 includeGroupByRegex("androidx.*")
  11.             }
  12.         }
  13.         mavenCentral()
  14.         gradlePluginPortal()
  15.     }
  16. }
  17. dependencyResolutionManagement {
  18.     repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
  19.     repositories {
  20.         maven {url 'https://maven.aliyun.com/repository/google'}
  21.         maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
  22.         maven {url 'https://maven.scijava.org/content/repositories/public/'}
  23.         maven {url 'https://maven.aliyun.com/repository/public'}
  24.         google()
  25.         mavenCentral()
  26.     }
  27. }
  28. rootProject.name = "My Application"
  29. include ':app'
复制代码



三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:01 | 显示全部楼层
依赖下载完成:

截图202503211528427891.jpg
点击顶部绿色三角形编译+运行:
截图202503211528576284.jpg
如果没装模拟器,可在界面右侧手动添加:
截图202503211529205782.jpg


也可以使用wifi无线真机调试:

打开开发者模式:

安卓手机->设置->关于手机->多次点击版本号开启开发者模式(不同品牌可能方法有点差异可以网上搜下自己手机)

使用无线调试:

返回设置->系统和更新->开发者选项->无线调试(确保手机和电脑在同一局域网内)->打开无线调试 ->使用二维码配对->扫码即可


截图202503211529382880.jpg
截图202503211529511484.jpg
截图202503211529586028.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:02 | 显示全部楼层
NDK安装:

截图202503211530589722.jpg
截图202503211531094826.jpg
截图202503211531221785.jpg
截图202503211531295437.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:03 | 显示全部楼层
关联C++文件:

1.右键点击项目,选择添加C++ Module
截图202503211532047915.jpg
截图202503211532131712.jpg
等待gradle config完成,注意项目结构下多了个cpp文件夹
截图202503211532298229.jpg

2.修改界面

界面上自带的TextView组件声明id为textLabel

截图202503211532447133.jpg

添加一个button
截图202503211532587715.jpg

添加一个输入框

截图202503211533132262.jpg


3.修改java代码

native函数调用C++代码


  1. static {
  2.     System.loadLibrary("myapplication");
  3.     }
  4.     public native String sayHello(String name);
复制代码
截图202503211534019965.jpg
4.修改C++代码,实现native函数
截图202503211534138634.jpg
ide自动定义C++函数,添加实现

截图202503211534281986.jpg

  1. #include <jni.h>
  2. #include <string>
  3. extern "C"
  4. JNIEXPORT jstring JNICALL
  5. Java_com_example_myapplication_MainActivity_sayHello(JNIEnv *env, jobject thiz, jstring name) {
  6.     // 检查传入的 name 是否为 nullptr
  7.     if (name == nullptr) {
  8.         return env->NewStringUTF("Hello, World!");
  9.     }
  10.     // 将 jstring 转换为 C++ 的 std::string
  11.     const char *nativeName = env->GetStringUTFChars(name, nullptr);
  12.     if (nativeName == nullptr) {
  13.         return env->NewStringUTF("Hello, World!"); // 内存不足时的默认返回
  14.     }
  15.     std::string greeting = "Hello, " + std::string(nativeName) + "!";
  16.     // 释放字符串资源
  17.     env->ReleaseStringUTFChars(name, nativeName);
  18.     // 将 C++ 字符串转换回 jstring 并返回
  19.     return env->NewStringUTF(greeting.c_str());
  20. }
复制代码
保存
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:04 | 显示全部楼层
5.添加按钮事件调用C++代码

MainActivity.java文件完整代码

  1. package com.example.myapplication;
  2. import android.os.Bundle;
  3. import android.widget.EditText;
  4. import android.widget.TextView;
  5. import android.widget.Button;
  6. import androidx.activity.EdgeToEdge;
  7. import androidx.appcompat.app.AppCompatActivity;
  8. import androidx.core.graphics.Insets;
  9. import androidx.core.view.ViewCompat;
  10. import androidx.core.view.WindowInsetsCompat;
  11. public class MainActivity extends AppCompatActivity {
  12.     static {
  13.         System.loadLibrary("myapplication");
  14.     }
  15.     public native String sayHello(String name);
  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         EdgeToEdge.enable(this);
  20.         setContentView(R.layout.activity_main);
  21.         ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
  22.             Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
  23.             v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
  24.             return insets;
  25.         });
  26.         // 通过id获取Button控件实例
  27.         Button button = findViewById(R.id.button);
  28.         button.setOnClickListener(v -> {
  29.             EditText editText = findViewById(R.id.nameEdit);
  30.             String inputText = editText.getText().toString();
  31.             
  32.             // 调用本地方法,传递输入的文本
  33.             String msg = sayHello(inputText);
  34.             // 获取 TextView 实例
  35.             TextView textLabel = findViewById(R.id.textLabel);
  36.             // 调用本地方法,传递 TextView 引用
  37.             textLabel.setText(msg);
  38.         });
  39.     }
  40. }
复制代码


三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-21 15:46:05 | 显示全部楼层
NDK调用调试:

截图202503211535393080.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 23:52 , Processed in 0.827180 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表