现在我们介绍一下怎么生成aar包和unity怎么调用aar

一、通过Android studio生成aar

首先,在Android studio上面新建一个工程。

unity 调用java方法 unity调用aar_unity 调用java方法

选择你要发布的Android 版本,注意:要和unity保持一致。

unity 调用java方法 unity调用aar_Android_02

选择empty activity

unity 调用java方法 unity调用aar_Android_03

默认的activity name不用动,直接点finish

 

unity 调用java方法 unity调用aar_System_04

找到unity的安装路径D:\****\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

unity 调用java方法 unity调用aar_unity 调用java方法_05

复制class.jar到Android studio\Project\app\libs

unity 调用java方法 unity调用aar_jar_06

在Android studio的file 找到Project Structure... 点击

unity 调用java方法 unity调用aar_System_07

接下来找到app,找到dependdencies,点击右边的+号,选择第二个 2 file dependency

unity 调用java方法 unity调用aar_Android_08

找到 libs下刚导进去的class.jar, 点击OK

unity 调用java方法 unity调用aar_Android_09

接下来就是在MainActivity里编写接口了

unity 调用java方法 unity调用aar_unity 调用java方法_10

将MainActivity继承UnityPlayerActivity,然后删掉setContentView(R.layout.activity_main); 如果不继承UnityPlayerActivity也是可以的,

类似这样

unity 调用java方法 unity调用aar_jar_11

或者这样

unity 调用java方法 unity调用aar_unity 调用java方法_12

 选择其中的一种编写来接口

package com.hello.world;

import android.os.Bundle;
import android.util.Log;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
  //接口
    public String test()
    {
        Log.v("测试","成功");
        return "测试成功";
    }

}

<meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 

unity 调用java方法 unity调用aar_unity 调用java方法_13

 

OK,目前为止准备工作已经完成了,接下来该打aar包了

 

点击Build/Build APK

unity 调用java方法 unity调用aar_System_14

 

当Android studio右上角显示这个时,说明已经build成功了

unity 调用java方法 unity调用aar_System_15

 

好了,结束了,已经打包好了arr包,就在outputs下,跟打jar包相比是不是省事多了

unity 调用java方法 unity调用aar_Android_16

二、unity调用aar

 

新建一个工程,将unity切换到Android平台,点击player Setting

unity 调用java方法 unity调用aar_unity 调用java方法_17

将unity的包名和Android的版本设置的和aar包的一样

unity 调用java方法 unity调用aar_unity 调用java方法_18

 

在assets先创建Plugins/Android,主要名字别写错了,在Android studio中找到aar包,把它放在Android文件夹下,arr和jar一样,名字可以随意改,

把Android studio里的AndroidManifest.XML也放到unity的Plugins/Android路径下。

unity 调用java方法 unity调用aar_System_19

 

添加脚本test,保存场景为test

unity 调用java方法 unity调用aar_unity 调用java方法_20

 

接下来的这一步非常关键:

 在unity里双击你的arr包,如果不能打开,就下一个解压工具,双击app-debug后会弹出这个框

unity 调用java方法 unity调用aar_jar_21

找到libs,打开

unity 调用java方法 unity调用aar_jar_22

 

 删掉里面的class.jar, 关闭窗口,不删掉会报错的同志们。

 

unity 调用java方法 unity调用aar_Android_23

 

 然后在test脚本里添加如下代码

1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class Test : MonoBehaviour {
 6 
 7     void OnGUI()
 8     {
 9         //方法一
10         try {
11             var javaClass = new AndroidJavaObject("com.hello.world.MainActivity");
12             string value1=javaClass.Call<string>("test");
13             GUI.Label (new Rect(10,10,500,500),value1);
14         } catch (System.Exception ex) {
15             GUI.Label (new Rect(10,10,500,500),ex.ToString());
16         }
17         //方法二
18         try {
19             AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
20             AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
21             string value2=jo.Call<string> ("test");
22             GUI.Label(new Rect(20,20,500,500),value2);
23         } catch (System.Exception ex) {
24             GUI.Label (new Rect(20,20,500,500),ex.ToString());
25         }
26 
27     }
28 }

 

 打包场景,搞定。

Android模拟器运行结果:

unity 调用java方法 unity调用aar_System_24

 

 

如果你按我上面的步骤进行的,或者看其他人写的教程,Unity在Build时都一样报错,那么恭喜你,你将终结这个噩梦。

1、找到Android studio工程里的values/styles.xml

 

unity 调用java方法 unity调用aar_System_25

2、打开后是这样子的

unity 调用java方法 unity调用aar_System_26

3、同志们,重点来了,简单粗暴一点,将styles.xml里的东西统统删掉,只留下如下内容

unity 调用java方法 unity调用aar_jar_27

OK了,重新生成aar包,然后放心的扔到Unity了Build去吧,绝对不会再有问题了。

之前认为unity场景中存在多个 AndroidManifast.XML 时,会冲突

之前认为unity场景中导入aar包的时候必须在/Plugins/Android路径下添加其AndroidManifast.XML

今天测试发现,这两种问题都不存在了,当时可是折磨了半个月呀,难道是unity版本更新导致问题解决了?

不过目测不能通过

AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
string value2=jo.Call<string> ("test");

这种方法调用,报空。

我是用下面的方法调用成功的

1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class NewBehaviourScript : MonoBehaviour {
 6 
 7     void OnGUI()
 8     {
 9         try {
10             AndroidJavaObject jc = new AndroidJavaObject ("com.hello.world.MainActivity");
11             string value2=jc.Call<string> ("test");
12             GUI.Label(new Rect(20,20,500,500),value2);
13         } catch (System.Exception ex) {
14             GUI.Label (new Rect(20,20,500,500),ex.ToString());
15         }
16     }
17 }