基于Unity2017.4.37c2,AndroidStudio3.5.2,最小安卓版本23,目标版本26

unity引用aar中的so unity调用aar包_unity

首先创建一个安卓项目,项目名和包名随意取,如果只是把某个功能嵌入到Unity里,不需要用到这两个,项目类型选择Empty Activity

unity引用aar中的so unity调用aar包_android_02

unity引用aar中的so unity调用aar包_android_03

建立完项目之后,要等待AndroidStudio加载完依赖项,才可以创建Module,在全部加载完成之前,New-Module按钮为灰色

unity引用aar中的so unity调用aar包_unity引用aar中的so_04

等待加载完成之后,我们点击建立一个Module

unity引用aar中的so unity调用aar包_jar_05

类型选择AndroidLibraly,此处名字要记住

unity引用aar中的so unity调用aar包_java_06

unity引用aar中的so unity调用aar包_java_07

建立完成之后,可以在左侧Project视窗中看见,如果找不到对应文件夹,可以把上方改成Project

unity引用aar中的so unity调用aar包_unity_08

之后我们点击上方菜单栏File-Project Structure按钮

unity引用aar中的so unity调用aar包_unity_09

在Dependencies菜单中将工程自带的app文件夹删掉

unity引用aar中的so unity调用aar包_unity引用aar中的so_10

从Unity安装目录Unity\2017.4.37c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes下,把Classes.jar包拖入到lib文件夹下

unity引用aar中的so unity调用aar包_unity_11

再次进入File-Project Structure-Dependencies界面,点击加号,将lib下的Classes.jar添加进去

unity引用aar中的so unity调用aar包_android_12

之后,我们在src-main-java-com.cuihuo.test2unity文件夹下右键-New-JavaClass创建一个类

unity引用aar中的so unity调用aar包_unity_13

键入以下代码,此处要特别注意,android.app.Fragment已经被弃用,如果自己手动输入extends Fragment的话,AndroidStudio会自动引用androidx.fragment.app.Fragment,此时add(Instance,"Test2Unity")语句会报错,将Instance改成new android.app.Fragment()即可解决报错,但是能不能与Unity进行交互我没有测试过,所以此处需要我们手动引用android.app.Fragement;

package com.cuihuo.test2unity;

import android.app.Fragment;

import com.unity3d.player.UnityPlayer;

public class test2Unity extends Fragment {
    public static test2Unity Instance;
    public static void Start()
    {
        Instance=new test2Unity();
        UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance,"Test2Unity").commit();
    }
    public void CallBack(String _obj, String _fun, String _val){
        UnityPlayer.UnitySendMessage(_obj, _fun, "Android Callback " + _val);
    }
}

之后点开test2unity文件夹下的build.gradle文件

unity引用aar中的so unity调用aar包_android_14

在最后面加上以下代码

task makeJar(type: Copy) {
    delete 'build/libs/test2unity.jar'
    from('build/intermediates/packaged-classes/release/')
    into('buildbs/')
    include('classes.jar')
    rename ('classes.jar', 'test2unity.jar')
}
allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}

exportJar.dependsOn(deleteOldJar, build)

此处是参考这篇博客,经过实际测试之后,打包出来并没有release文件夹,但是第二个方法代码不可删除,删除会无法导出jar包,第三个方法是解决使用过时api导致的导出报错问题,参考这篇博客

输入完成之后,我们在右侧Gradle界面,选中对应文件,右键-Refresh Gradle project

(因为遇到了个BUG,更换了打包Jar包的方法,此图内的代码不可做为参考,打包Jar包的时候不可将Classes一起打包,在高版本的Unity里会遇到重复依赖的错误)

unity引用aar中的so unity调用aar包_jar_15

运行完成之后,原文件下方会出现一个单独的对应文件,选中新创建出来的test2unity-test2unity-Tasks-other-MakeJar

unity引用aar中的so unity调用aar包_unity引用aar中的so_16

unity引用aar中的so unity调用aar包_android_17

打包完成之后不会出现Releas文件夹,而是在对应的项目目录下的buildbs文件夹下,其中即是我们要使用的安卓包

unity引用aar中的so unity调用aar包_unity_18

将其放入我们的Unity项目中,新建一个Text

unity引用aar中的so unity调用aar包_jar_19

新建一个Test.cs,键入以下代码,随便挂在游戏内哪个物体上,将Text拖入对应的变量里

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Test : MonoBehaviour {
	public Text txt;
	// Use this for initialization
	void Start () {
		AndroidJavaClass ajc= new AndroidJavaClass("com.cuihuo.test2unity.test2Unity");
		ajc.CallStatic("Start");
		AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("Instance");
		ajo.Call("CallBack",this.gameObject.name,"SetText","测试");
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	public void SetText(string str) 
	{
		txt.text = str;
	}
}

这其中有几个需要注意的地方,AndroidJavaClass中的String路径,是由包名及类名组成的,要特别注意大小写,其中包名在一开始我们写的那段代码中可以看到Package com.cuihuo.test2unity,类名就是我们新建脚本时所命名的,AndroidJavaObject即是类中的变量,最后放个成功运行的效果

unity引用aar中的so unity调用aar包_java_20