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实在是问题多多,推荐上面两种方法。

相关推荐
不是AI2 小时前
【Unity开发】一、在安卓设备上运行Unity项目
android·unity·游戏引擎
p***19942 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
wsfk12342 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
撩得Android一次心动2 小时前
Android DataBinding 全面解析【使用篇】
android·jetpack·databinding
Web打印4 小时前
Phpask(php集成环境)之06每个网站单独设置PHP版本
android
fengci.4 小时前
baby杯
android
lbb 小魔仙11 小时前
【Java】Java 实战项目:手把手教你写一个电商订单系统
android·java·python
coderYYY13 小时前
VSCode终端启动报错
前端·ide·vscode·npm·编辑器