ercircle 发表于 2025-3-18 10:34:48

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

<p>此帖老是丢图,可以阅览下面这个链接:</p>
<p><a href="https://www.stcaimcu.com/forum.php?mod=viewthread&amp;tid=16439&amp;extra=page%3D2">手机APP工具开发指南--安卓篇,手机的USB-OTG 和 Ai8051U 通信 - SDCC, IAR C++ for 51, GCC, VSCode,Linux, MacOS 国芯技术交流网站 - AI32位8051交流社区</a></p>
<h1>一、环境安装</h1>
<p><strong>注意不要安装在VM等虚拟机里,否则可能无法使用安卓模拟器。</strong></p>
<h2>1. 安装JDK</h2>
<p><img src="data/attachment/forum/202503/21/092047s2bqlspinhq0qpdd.png" alt="image.png" title="image.png" /></p>
<p>配置环境变量<br />
这里用的默认路径,按照自己的路径配置即可。</p>
<p>JAVA_HOME C:\Program Files\Java\jdk-17</p>
<p><img src="data/attachment/forum/202503/21/092059lppedw5zdwl6pds8.png" alt="image.png" title="image.png" /></p>
<p>配置path:<br />
%JAVA_HOME%\bin</p>
<p><img src="data/attachment/forum/202503/21/092107pngnngzy7838g8n3.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/092115m0oeg2h2joqocq1b.png" alt="image.png" title="image.png" /></p>
<p>测试是否安装成功:</p>
<blockquote>
<p>java -version</p>
</blockquote>
<p><img src="data/attachment/forum/202503/21/092124vqz1q82u0i2qqrpi.png" alt="image.png" title="image.png" /></p>
<h2>2. 拷贝gradle</h2>
<p>gradle正常是Android Studio自动联网下载的,下载不了可以设置本地路径<br />
拷贝压缩包就行,不需要解压。路径中最好不要有中文或空格等特殊字符</p>
<p><img src="data/attachment/forum/202503/21/092131h6n8eu4u44filn4x.png" alt="image.png" title="image.png" /></p>
<h2>3. 安装Android Studio</h2>
<p>除了安装路径自定义,其它默认下一步即可。</p>
<p><img src="data/attachment/forum/202503/21/092139o0jywy0kqn008jrj.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/092144wv757oyvaayay77b.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/092150g7oy9bdsy7b875sy.png" alt="image.png" title="image.png" /></p>
<h2>4. 安装sdk</h2>
<p>启动Android Studio</p>
<p><img src="data/attachment/forum/202503/21/092157qjuceckludv4jkx4.png" alt="image.png" title="image.png" /></p>
<p>这里点cancel即可</p>
<p><img src="data/attachment/forum/202503/21/092205ye4aba77e77onawa.png" alt="image.png" title="image.png" /></p>
<p>自定义sdk放置路径选custom(注意SDK需要空间较大,几十GB级别)</p>
<p><img src="data/attachment/forum/202503/21/092211gbevemju3kvz2r3h.png" alt="image.png" title="image.png" /></p>
<p>安装sdk和虚拟机</p>
<p><img src="data/attachment/forum/202503/21/092217nnrsfvirv67vzle5.png" alt="image.png" title="image.png" /></p>
<p>点Accept,Finish等待下载完成</p>
<p><img src="data/attachment/forum/202503/21/092223fr07wjhjwd7rxdv0.png" alt="image.png" title="image.png" /></p>
<h1>二、新建项目</h1>
<p><img src="data/attachment/forum/202503/24/234030e1g72rse1sqrrker.png" alt="image.png" title="image.png" /></p>
<p>选择Empty Views Activity(注意第二个项目默认只有Kotlin语言不要选错,下文用java项目示例):</p>
<p><img src="data/attachment/forum/202503/24/234037hszz55n9no898tqt.png" alt="image.png" title="image.png" /></p>
<p>项目配置选择(注意默认Kotlin语言,楼主这里选java):</p>
<p><img src="data/attachment/forum/202503/24/234044fb03tr1exlldln80.png" alt="image.png" title="image.png" /></p>
<p>等待ide初始化完成。弹出adb联网请求允许即可。</p>
<p><img src="data/attachment/forum/202503/24/234051n8xxw5y5fgxyb8dx.png" alt="image.png" title="image.png" /></p>
<p>这里部分网络环境不好的会报错,改用本地gradle路径即可。</p>
<blockquote>
<p>distributionUrl=file:///E:/env/gradle-8.11.1-bin.zip</p>
</blockquote>
<p><img src="data/attachment/forum/202503/21/092242usskgm5qz5bqdkw5.png" alt="image.png" title="image.png" /></p>
<p>点击try again,等待gradle下载依赖文件(时间较长,耐心等待)</p>
<p>下载报错或者太慢的,可以点左下角?-&gt;红色方框停止,然后修改项目根目录settigns.gradle配置阿里maven源:</p>
<p><img src="data/attachment/forum/202503/21/092248v4u7m7ef766tx9mq.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/24/234103rwv5iaz1lwkkli7v.png" alt="image.png" title="image.png" /></p>
<pre><code class="language-code">pluginManagement {
    repositories {
      maven {url 'https://maven.aliyun.com/repository/google'}
      maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
      maven {url 'https://maven.aliyun.com/repository/public'}
      google {
            content {
                includeGroupByRegex(&quot;com\\.android.*&quot;)
                includeGroupByRegex(&quot;com\\.google.*&quot;)
                includeGroupByRegex(&quot;androidx.*&quot;)
            }
      }
      mavenCentral()
      gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
      maven {url 'https://maven.aliyun.com/repository/google'}
      maven {url 'https://maven.aliyun.com/repository/gradle-plugin'}
      maven {url 'https://maven.scijava.org/content/repositories/public/'}
      maven {url 'https://maven.aliyun.com/repository/public'}
      google()
      mavenCentral()
    }
}

rootProject.name = &quot;My Application&quot;
include ':app'
</code></pre>
<p>依赖下载完成:</p>
<p><img src="data/attachment/forum/202503/24/234111xjfk2y3g2ia2qiwm.png" alt="image.png" title="image.png" /></p>
<p>点击顶部绿色三角形编译+运行:</p>
<p><img src="data/attachment/forum/202503/24/234118aue5ogdje1o7g7o5.png" alt="image.png" title="image.png" /></p>
<p>如果没装模拟器,可在界面右侧手动添加:</p>
<p><img src="data/attachment/forum/202503/24/234124x4ncr116wwc4cmn9.png" alt="image.png" title="image.png" /></p>
<p>也可以使用wifi无线真机调试:</p>
<p>打开开发者模式:</p>
<p>安卓手机-&gt;设置-&gt;关于手机-&gt;多次点击版本号开启开发者模式(不同品牌可能方法有点差异可以网上搜下自己手机)</p>
<p>使用无线调试:</p>
<p>返回设置-&gt;系统和更新-&gt;开发者选项-&gt;无线调试(确保手机和电脑在同一局域网内)-&gt;打开无线调试<br />
-&gt;使用二维码配对-&gt;扫码即可</p>
<p><img src="data/attachment/forum/202503/24/234134six6xj6id6nd66dn.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/24/234141ywzjvow4c8z41vjj.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/24/234151vctsg72tnnmg28xb.png" alt="image.png" title="image.png" /></p>
<h1>三、NDK安装</h1>
<p><img src="data/attachment/forum/202503/21/115937q85w1p5sab6na1ca.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/115945w5cvraudrou3ou32.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/115952wz2jng1fu1kgz2jk.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/115958ulql9z1dvf99zddd.png" alt="image.png" title="image.png" /></p>
<h1>四、关联C++文件</h1>
<p><code>1.右键点击项目,选择添加C++ Module</code></p>
<p><img src="data/attachment/forum/202503/21/120008d8mlo1hll18dv8mg.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/120020kzvtmufu6mux3i1m.png" alt="image.png" title="image.png" /></p>
<p><code>等待gradle config完成,注意项目结构下多了个cpp文件夹</code></p>
<p><img src="data/attachment/forum/202503/21/120027bg1j971jitp75rrd.png" alt="image.png" title="image.png" /></p>
<ol start="2">
<li>修改界面</li>
</ol>
<p>界面上自带的TextView组件声明id为textLabel</p>
<p><img src="data/attachment/forum/202503/21/120034k6qviyb6u26zs2d9.png" alt="image.png" title="image.png" /></p>
<p><code>添加一个button</code></p>
<p><img src="data/attachment/forum/202503/21/120042h5e54j4m44zj4m80.png" alt="image.png" title="image.png" /></p>
<p><code>添加一个输入框</code></p>
<p><img src="data/attachment/forum/202503/21/120048yru82eurr22z8p8r.png" alt="image.png" title="image.png" /></p>
<ol start="3">
<li>修改java代码</li>
</ol>
<p>native函数调用C++代码</p>
<pre><code class="language-java">    static {
      System.loadLibrary(&quot;myapplication&quot;);
    }
    public native String sayHello(String name);
</code></pre>
<p><img src="data/attachment/forum/202503/21/120106ugtkstyfgtcs2lfa.png" alt="image.png" title="image.png" /></p>
<p>4.修改C++代码,实现native函数</p>
<p><img src="data/attachment/forum/202503/21/120115ihyjttrbwjtb86y0.png" alt="image.png" title="image.png" /></p>
<p>ide自动定义C++函数,添加实现</p>
<p><img src="data/attachment/forum/202503/21/120139w5r42v4gwgv5q2r1.png" alt="image.png" title="image.png" /></p>
<pre><code class="language-cpp">#include &lt;jni.h&gt;
#include &lt;string&gt;

extern &quot;C&quot;
JNIEXPORT jstring JNICALL
Java_com_example_myapplication_MainActivity_sayHello(JNIEnv *env, jobject thiz, jstring name) {
    // 检查传入的 name 是否为 nullptr
    if (name == nullptr) {
      return env-&gt;NewStringUTF(&quot;Hello, World!&quot;);
    }

    // 将 jstring 转换为 C++ 的 std::string
    const char *nativeName = env-&gt;GetStringUTFChars(name, nullptr);
    if (nativeName == nullptr) {
      return env-&gt;NewStringUTF(&quot;Hello, World!&quot;); // 内存不足时的默认返回
    }

    std::string greeting = &quot;Hello, &quot; + std::string(nativeName) + &quot;!&quot;;

    // 释放字符串资源
    env-&gt;ReleaseStringUTFChars(name, nativeName);

    // 将 C++ 字符串转换回 jstring 并返回
    return env-&gt;NewStringUTF(greeting.c_str());
}
</code></pre>
<p>保存</p>
<p>5.添加按钮事件调用C++代码</p>
<p>MainActivity.java文件完整代码</p>
<pre><code class="language-java">package com.example.myapplication;

import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    static {
      System.loadLibrary(&quot;myapplication&quot;);
    }
    public native String sayHello(String name);


    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      EdgeToEdge.enable(this);
      setContentView(R.layout.activity_main);
      ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -&gt; {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
      });
      // 通过id获取Button控件实例
      Button button = findViewById(R.id.button);
      button.setOnClickListener(v -&gt; {

            EditText editText = findViewById(R.id.nameEdit);
            String inputText = editText.getText().toString();

            // 调用本地方法,传递输入的文本
            String msg = sayHello(inputText);
            // 获取 TextView 实例
            TextView textLabel = findViewById(R.id.textLabel);
            // 调用本地方法,传递 TextView 引用
            textLabel.setText(msg);
      });

    }

}

</code></pre>
<ol start="6">
<li>NDK测试</li>
</ol>
<p><img src="data/attachment/forum/202503/21/120152dz4iw6sz6hnrzzgm.png" alt="image.png" title="image.png" /></p>
<h1>五、安卓App与Ai8051U擎天柱开发板通讯</h1>
<h2>5.1 功能说明</h2>
<ol>
<li>初始化界面时,绑定UI控件各自事件</li>
<li>点击刷新按钮,重新加载所有USB设备并更新spinner组件</li>
<li>选择一个设备后点击连接按钮,建立与设备的通信链接</li>
<li>在发送报文输入框中输入要发送的报文内容,点击发送按钮</li>
<li>报文经过C++底层库,添加“Hello,”前缀后发送给设备</li>
<li>设备接收到报文后返回原文,在底部显示区域展示</li>
<li>软件打印的消息也在底部显示区域展示</li>
<li>断开设备和软件退出时释放资源</li>
</ol>
<h2>5.2 构建界面布局</h2>
<p><img src="data/attachment/forum/202503/21/120221i98ket4e57zvyjt9.png" alt="image.png" title="image.png" /></p>
<p>左上角使用spinner组件显示USB-设备下拉列表<br />
一个刷新用的按钮<br />
一个连接设备用的按钮<br />
一个发送报文用的输入框及按钮<br />
一个清空日志按钮<br />
底部ScrollView+TextView组合用于显示接收到的报文信息及软件打印消息</p>
<h2>5.3 开发关键点</h2>
<p>1.注册安卓USB权限</p>
<p><img src="data/attachment/forum/202503/21/120228jdrp1ek1b7y1gzqk.png" alt="image.png" title="image.png" /></p>
<p>2.注册设备vid+pid过滤器,这样插入设备会提示用户用此APP打开</p>
<p><img src="data/attachment/forum/202503/21/120236ixoeq57qi0z40m7y.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202503/21/120242ll55l56wvvvrwar5.png" alt="image.png" title="image.png" /></p>
<p>3.加载三方usb-serial库(基于MIT协议)</p>
<p><img src="data/attachment/forum/202503/21/120248ekxkgamk2z5gfs5k.png" alt="image.png" title="image.png" /></p>
<p>4.待连接的擎天柱开发板烧录USB-CDC固件(见附件),并支持echo模式,即发送什么返回什么</p>
<h2>5.4 最终效果</h2>
<p><img src="data/attachment/forum/202503/21/120254pxqsrnnkfld7sdsq.png" alt="image.png" title="image.png" /></p>

ercircle 发表于 2025-3-18 10:34:54

安装包:


android-studio-2024.3.1.13-windows.exe 太大无法上传,自行在android studio官网下载最新版本
可直接使用的固件:


工程源码:
apk:
擎天柱固件:
手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信,效果展示:
665
手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信

fjstcmcu 发表于 2025-3-18 14:26:19

支持一下!!{:4_174:}

lgnstar 发表于 2025-4-2 08:47:13

强大 {:qiang:}

机灵小老鼠 发表于 2025-4-3 23:04:23

厉害了我的哥

zhaoye818 发表于 2025-4-8 07:47:14

{:qiang:}

猫虎的 发表于 2025-4-8 08:38:32

厉害

rayrakey 发表于 2025-4-8 08:55:22

厉害

HHF 发表于 2025-4-10 08:05:27

谢谢分享

hadv 发表于 2025-4-10 15:32:32

厉害!{:qiang:}
页: [1] 2 3 4 5
查看完整版本: 手机APP工具开发指南--安卓篇,手机的USB-OTG 和 Ai8051U 通信