ercircle 发表于 2025-3-21 15:45:56

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

手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信,效果展示:
668
手机APP工具开发指南--安卓篇,手机的 USB-OTG 和 Ai8051U 通信


安装包:


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


工程源码:
apk:
擎天柱固件:


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

1. 安装JDK


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

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



配置path:
%JAVA_HOME%\bin



测试是否安装成功:
java -version


神农鼎 发表于 2025-7-19 11:42:06

证明 :STC的USB型MCU 和手机通信,USB是畅通的方案

ercircle 发表于 2025-3-21 15:45:57

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

ercircle 发表于 2025-3-21 15:45:58

3. 安装Android Studio

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






ercircle 发表于 2025-3-21 15:45:59

4. 安装sdk
启动Android Studio

下面这里点cancel即可

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

安装sdk和虚拟机

点Accept,Finish等待下载完成


ercircle 发表于 2025-3-21 15:46:00

二、新建项目


选择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'


ercircle 发表于 2025-3-21 15:46:01

依赖下载完成:


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

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



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

打开开发者模式:

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

使用无线调试:

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






ercircle 发表于 2025-3-21 15:46:02

NDK安装:






ercircle 发表于 2025-3-21 15:46:03

关联C++文件:

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


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


2.修改界面

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



添加一个button


添加一个输入框




3.修改java代码

native函数调用C++代码


static {
    System.loadLibrary("myapplication");
    }
    public native String sayHello(String name);
4.修改C++代码,实现native函数

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



#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_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());
}保存

ercircle 发表于 2025-3-21 15:46:04

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);
      });

    }

}

ercircle 发表于 2025-3-21 15:46:05

NDK调用调试:


页: [1] 2 3
查看完整版本: 手机APP工具开发指南--安卓篇,手机的USB-OTG 和 Ai8051U 通信 | 单片机/手机USB通信