Unity和Android Studio相互调用 CH340在unity中调用

看了好多文章,如果只是简单的调用Android Studio 程序或者jar的插件,不需要在android studio中加入unity的class.jar

具体方法:

1.创建AS项目

这个随便选,随便创建,反正最后生成unity用的插件,是从module里生成的。

2.创建module

在project视图里,创建module

module类型选择Android Library

这次得注意了,新建的module就是我们要导出的插件,名称得记好,后面在unity中调用会用到。

如果记不住的话,可以再返回AS查看。

Language选择java,min SDK选的低一点,反正无所谓,直接选择4.0就好。

3.导入需要引用的jar包,或者自己用java写一些需要调用的代码

我需要引用ch340的jar包,这里直接导入到libs里面(注意,是新建的module的lib,不是android工程的libs,看图吧),在AS外面复制jar包,到AS里面,在libs文件夹上右键 粘贴。

粘贴后,右键--Add as Library,选择作为编写程序的依赖库。

4.编写AS程序,导出jar插件包

在android视图下

添加可调用的代码

java 复制代码
package com.enjoy.ch340;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.hardware.usb.UsbManager;
import android.widget.Toast;
import cn.wch.ch34xuartdriver.CH34xUARTDriver;

public class Test {
    public static CH34xUARTDriver driver;
    public static final String TAG = "cn.wch.wchusbdriver";
    private static final String ACTION_USB_PERMISSION = "cn.wch.wchusbdriver.USB_PERMISSION";
    public byte[] ReadBuf=new byte[1024];

    private static Context context;
    private static Activity unityActivity;


    public int Add(int a,int b){
        return a+b;
    }

    public static void receiveUnityActivity(Activity tActivity){
        unityActivity = tActivity;

    }

    public void Toast(String msg){
        Toast.makeText(unityActivity,msg,Toast.LENGTH_SHORT).show();
    }

    public void StartCH340() {
        context = unityActivity.getApplication(); //获取程序全局context 出问题了先找这里吧
        driver = new CH34xUARTDriver(
                (UsbManager) context.getSystemService(Context.USB_SERVICE), context,
                ACTION_USB_PERMISSION);  //定义CH340 drive
    }

    public int CHResumeUsbList(){
        return driver.ResumeUsbList();
    }

    public boolean CHUartInit(){
        return driver.UartInit();
    }

    public boolean CHSetConfig(int i,byte b,byte b1,byte b2,byte b3){
        return  driver.SetConfig(i, b, b1, b2, b3);
    }

    public int CHWriteData(byte[] buf,int length){
        return driver.WriteData(buf,length);
    }

    public int CHReadData(int length){
        return driver.ReadData(ReadBuf,length);
    }
}

由于我调用ch340,需要一些其他的资源文件(ch340芯片的usb设备码),需要在res文件夹下添加,只是调用AS,可以忽略这一步。

好了,写完代码保存就可以导出了。在android视图中,选中module,Build---Make Module'xxx-xxx'(你新建的module名称)。

在project视图中,build - outputs-aar中找到生成的 xxx-debug。aar,复制到UNIty工程中。

5.Unity中调用aar

把生成的 xxx-debug.aar放到 unity 工程的 Asset/Plugins/Android/ 目录下。没有的话就手动创建目录。

创建C#脚本,调用AS插件

java 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;


public class ch340 : MonoBehaviour
{

    public GameObject gg,ee;
    AndroidJavaClass unityClass;
    AndroidJavaObject unityActivity;
    AndroidJavaObject _plugin;
   
    void Start()
    {
   

        try {   Initialize("com.enjoyplay.mylib.Test");     }
        catch  (Exception e) {
               ee.GetComponent<Text>().text=e.Message;
               }
     }

    // Update is called once per frame
    void Update()
    {

    }
    public void Initialize(string plugin_name){
        _plugin=new AndroidJavaObject(plugin_name);
       if(_plugin!=null){
             gg.GetComponent<Text>().text=_plugin.Call<int>("Add",9,2).ToString();
             unityClass=new AndroidJavaClass("com.unity3d.player.UnityPlayer");
             unityActivity=unityClass.GetStatic<AndroidJavaObject>("currentActivity");
             _plugin.CallStatic("receiveUnityActivity",unityActivity);

             _plugin.Call("Toast","HI World!");
            _plugin.Call("StartCH340");
            if (_plugin.Call<int>("CHResumeUsbList") == 0) { gg.GetComponent<Text>().text = "ResumeUsbList成功!"; }
            if (_plugin.Call<bool>("CHUartInit")) { gg.GetComponent<Text>().text = gg.GetComponent<Text>().text + "\n" + "初始化成功!"; }
       }
    }
    public void But()
    {
        Initialize("com.enjoyplay.mylib.Test");
    }
    
}

好了,可以调用了。这里要注意,如何使用ch340,需要在apk 的 AndroidManifest.xml里打开otg权限,简单的做法是直接生成apk,用反编译软件打开,然后直接更改AndroidManifest.xml后再重新打包签名,若是生产最终成品apk,可以用unity生成AS工程,在AS里更改AndroidManifest.xml,最后生成apk。

值得一提,直接在untiy里更改AndroidManifest.xml实在是问题多多,推荐上面两种方法。

相关推荐
alexhilton2 天前
端侧RAG实战指南
android·kotlin·android jetpack
二流小码农2 天前
鸿蒙开发:路由组件升级,支持页面一键创建
android·ios·harmonyos
xq95272 天前
Android 手游SDK组件化开发实战指南
android
煤球王子2 天前
学习记录:Android14中的WiFi-wpa_supplicant(1)
android
张小潇2 天前
AOSP15 Input专题InputDispatcher源码分析
android
TT_Close2 天前
【Flutter×鸿蒙】debug 包也要签名,这点和 Android 差远了
android·flutter·harmonyos
Kapaseker2 天前
2026年,我们还该不该学编程?
android·kotlin
雨白3 天前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk3 天前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING3 天前
RN容器启动优化实践
android·react native