手机APP工具开发指南--安卓篇

安卓手机APP工具开发全流程指南

手机APP工具开发指南--安卓篇

手机的USB-OTG 和 Ai8051U 通信

文章较长请耐心观看哦~

目录

1、环境安装

2、新建项目

3、NDK安装

4、关联C++文件

5、安卓App与Ai8051U

擎天柱开发板通讯

1

环境安装

图片

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

1.1

安装JDK

图片

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

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

图片

配置path:
%JAVA_HOME%\bin

图片

图片

测试是否安装成功:

图片

1.2

 拷贝gradle

gradle正常是Android Studio自动联网下载的,下载不了可以设置本地路径,拷贝压缩包就行,不需要解压,路径中最好不要有中文或空格等特殊字符。

图片

1.3

安装Android Studio

除了安装路径自定义,其它默认下一步即可。

图片

图片

图片

1.4

安装sdk

启动Android Studio

图片

这里点cancel即可

图片

自定义sdk放置路径选custom(注意SDK需要空间较大,几十GB级别)

图片

安装sdk和虚拟机

图片

点Accept,Finish等待下载完成

图片

2

新建项目

图片

选择Empty Views Activity(注意第二个项目默认只有Kotlin语言不要选错,下文用java项目示例):

图片

项目配置选择(注意默认Kotlin语言,楼主这里选java):

图片

等待ide初始化完成。弹出adb联网请求允许即可。

图片

这里部分网络环境不好的会报错,改用本地gradle路径即可。

distributionUrl=file:///E:/env/gradle-8.11.1-bin.zip

图片

图片

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

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

图片

图片

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("com\\.android.*")                includeGroupByRegex("com\\.google.*")                includeGroupByRegex("androidx.*")            }        }        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 = "My Application"include ':app'

依赖下载完成:

图片

点击顶部绿色三角形编译+运行:

图片

如果没装模拟器,可在界面右侧手动添加:

图片

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

打开开发者模式:

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

使用无线调试:

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

图片

3

NDK安装

图片

图片

图片

图片

图片

4

关联C++文件

图片

4.1

右键点击项目,选择添加C++ Module

图片

图片

等待gradle config完成,注意项目结构下多了个cpp文件夹

图片

4.2

修改界面

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

图片

添加一个button

图片

添加一个输入框

图片

4.3

修改java代码

native函数调用C++代码

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

图片

4.4

修改C++代码,实现native函数

图片

ide自动定义C++函数,添加实现

图片

#include <jni.h>#include <string>
extern "C"JNIEXPORT jstring JNICALLJava_com_example_myapplication_MainActivity_sayHello(JNIEnv *env, jobject thiz, jstring name) {    // 检查传入的 name 是否为 nullptr    if (name == nullptr) {        return env->NewStringUTF("Hello, World!");    }
    // 将 jstring 转换为 C++ 的 std::string    const char *nativeName = env->GetStringUTFChars(name, nullptr);    if (nativeName == nullptr) {        return env->NewStringUTF("Hello, World!"); // 内存不足时的默认返回    }
    std::string greeting = "Hello, " + std::string(nativeName) + "!";
    // 释放字符串资源    env->ReleaseStringUTFChars(name, nativeName);
    // 将 C++ 字符串转换回 jstring 并返回    return env->NewStringUTF(greeting.c_str());}

保存

4.5

添加按钮事件调用C++代码

MainActivity.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("myapplication");    }    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) -> {            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 -> {
            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);        });
    }
}

4.6

NDK测试

图片

5

安卓App与Ai8051U擎天柱开发板通讯

图片

5.1

功能说明

  1. 初始化界面时,绑定UI控件各自事件

  2. 点击刷新按钮,重新加载所有USB设备并更新spinner组件

  3. 选择一个设备后点击连接按钮,建立与设备的通信链接

  4. 在发送报文输入框中输入要发送的报文内容,点击发送按钮

  5. 报文经过C++底层库,添加“Hello,”前缀后发送给设备

  6. 设备接收到报文后返回原文,在底部显示区域展示

  7. 软件打印的消息也在底部显示区域展示

  8. 断开设备和软件退出时释放资源

5.2

构建界面布局

图片

左上角使用spinner组件显示USB-设备下拉列表

一个刷新用的按钮

一个连接设备用的按钮

一个发送报文用的输入框及按钮

一个清空日志按钮

底部ScrollView+TextView组合用于显示接收到的报文信息及软件打印消息

5.3

开发关键点

① 注册安卓USB权限

图片

② 注册设备vid+pid过滤器,这样插入设备会提示用户用此APP打开

图片

图片

③ 加载三方usb-serial库(基于MIT协议)

图片

④ 待连接的擎天柱开发板烧录USB-CDC固件(见附件),并支持echo模式,即发送什么返回什么

5.4

最终成果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值