看了好多文章,如果只是简单的调用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实在是问题多多,推荐上面两种方法。