前言
由于项目需求,我需要Unity与插在手机USB口的单片机通信,一开始十分不想接触java和android studio。因为有墙,每次我打开gradle都需要下载组件下载很久很久,大约一个小时,而且gradle的一堆语法我都看不懂,非常折磨。所以我一开始避开android,找了很多别的技术路径,但是最后他们全部不好使:
如果使用,会报错没有权限访问/dev路径:
Access to the path '/dev' is denied.
或者各种关于权限的问题,我遇见了至少三四种,就不多记录了。
一开始百思不得其解,因为写这些博客的博主都已经调通了,但是我就是调不通,但后来发现华点了,他们的标题都是"安卓串口"。安卓串口 和 安卓USB串口是不一样的,串口有可能指的是工业设备上的开发板引出的 485 串口。例如如下这些设备也很可能用的安卓系统,且一般都是有root权限的:
而对于正常用户的没有root权限的手机,最后就只剩使用android studio导出jar包,unity调用jar包这一条路了。原因则是android根本没有给so代码(即C代码)申请USB权限的接口,只有java有接口可以申请该权限。
构建项目
首先需要明确,咱们是需要android studio生成一个jar包给unity用,arr包亦可(arr包约等于jar包,他们的区别自行上网了解)。
这个流程需要咱们创建一个android studio project,具体流程参考下面这个文章
引用 usb-serial-for-android库
有了工程大框架后,我们在编写具体代码前需要引用 usb-serial-for-android库,这个库是最著名的,android USB serial通信的唯一解决方案。至于怎么用,当然是参考官方github的readme:
(https://github.com/mik3y/usb-serial-for-android)
但是,对gradle不熟的家人们估计一看就懵了:
所以咱们从头说起,首先对android studio项目结构做一个科普,以防跟我一样的小白连gradle是什么都不知道:
android studio项目使用gradle作为构建工具,整个项目有一个大的build.gradle.kts,每个模块有一个小的build.gradle.kts,用于规定各自都需要编译什么,都有哪些依赖库。gradle的定位相当于C语言的cmakelist。
其中,由于android版本的更新,整个项目的build.gradle.kts 很多配置全部移动到了项目根目录下的settings.gradle.kts中,所以你有时候会在网上找到两种不同的gradle代码,其中一种会报错,这属于正常情况,忍就行了。
比如:下面这些代码现在就需要放在settings.gradle.kts中
只有在settings.gradle.kts写了 maven { url = uri( " https://jitpack.io" ) } ,才能在小的build.gradle.kts里引用这种从网络上下载的库:
但是,实测国内因为网络有墙的问题,即使写对了,也会在构建的时候卡在下载不动弹。
所以替代措施就是手动下载过来,然后在小的gradle里直接按照路径引用即可:
(需要将jar包放在对应目录,即:你的library module的libs文件夹下。)
jar包的下载地址:https://github.com/cvasquez-github/unity-android-serial-arduino/blob/main/MyUnityPlayerActivity.java
然后即可编写相关代码,相关代码就是在这篇博客上修修补补,加上引用usb-serial-for-android库的部分,如果有人需要可以在评论区说,需要的人多了我会公布我自己写的代码。
最终生成arr包即可,也不用改class.jar和 AndroidManifest文件。Unity里怎么用导出的arr包也是看这个博客:
- Unity与Android交互方案优化版 - 简书
到这里本文正题就已经结束了,最终效果如下:
附录 1:Unity SO文件的兼容性问题
虽然so库导入unity的做法不能用,但是记录一波调试的流程。
用ndk编译so包,导入unity使用,应该需要有root权限的,安卓手机一般没有root权限,不能用。如这篇博客,我试了很久就不好使:
(https://blog.csdn.net/gaoyu123456789/article/details/133939181)
不同CPU架构需要不同的so库,需要使用 ndk 编译c语言代码,生成多个so库,以下面的路径放在unity文件夹下
对于unity,因为现在的手机都是arm64 的架构的了,只有你导出的时候导出arm64 版本的,手机才能找到相应的库,
需要将改成il2cpp,而不是mono,否则只能导出到armv7 平台,无法导出到arm64-v8a平台
il2cpp的兼容性更好,之后一直用这个就行了,但编译速度慢,如果没有高阶操作,不考虑兼容性问题,还是mono快一点
附录 2:司马博主,活全家
这些博主看着写的有模有样,我还花很大时间照着他们写的摸索,但看他们主页才发现一天能发几百篇文章,写的技术路线也完全行不通,只能说活全家了。
- mob649e816209c2的博客_51CTO博客
- unity android 通过USB转串口线连接_mob649e816209c2的技术博客_51CTO博客
- unity android 通过USB转串口线连接_mob649e816209c2的技术博客_51CTO博客
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/5506.html