在使用as接入安卓原生sdk时候,遇到了很多坑,这里做一下记录,希望帮到有缘人!

一,配置

arr包而不是jar包因为相对更方便,快捷,安全。

1:在as中创建module,选择 android lib,并设置模块名,对应的包名也是这个,所以对于有一些sdk需要在特定的包里的可以直接设置,也可以自定义包名后在创建对应的子包就可以了。

aosp导入androidstudio as导入sdk_包名

2,将要接入的sdk包放到libs文件夹下边 同时将unity的类库放入 classes.jar

       

aosp导入androidstudio as导入sdk_自定义_02

     放入的包需要添加依赖项,jar包可以直接右键,点击add as library ,或者去module下的build.gradle 里边配置

     api 可以使用这几个:

  

aosp导入androidstudio as导入sdk_aosp导入androidstudio_03

       

aosp导入androidstudio as导入sdk_xml_04

     打码的是你导入的包的名字,第三个是arr包的方式 第二个要是全路径,‘libs/’+包名

二,接入代码

大部分初始化等都需要在application或者mainactivity中,而我们刚创建的类库都是空的,需要自己定义 

aosp导入androidstudio as导入sdk_aosp导入androidstudio_05

在你的包名右键,点击new-activity -baseactivity 创建空活动页,并自定义名字,勾上launcher,

aosp导入androidstudio as导入sdk_包名_06

aosp导入androidstudio as导入sdk_自定义_07

将上图layout文件夹删除

aosp导入androidstudio as导入sdk_包名_08

然后去配置文件(AndroidManifest 。xml)这一部分都清掉,此时你的脚本还在报错,同样将报错的全部删除,不需要,再将appcompatActivity 改为 UnityPlayerActivity

aosp导入androidstudio as导入sdk_aosp导入androidstudio_09

aosp导入androidstudio as导入sdk_xml_10

然后你就可以接入对应的代码........

三,提供接口

  按照接入指南,你只能是在安卓端的,你需要为unity提供接口调用,比如初始化init等,

 定义public方法,可以带参数,如string ,int 等。来接受unity传入的数据

aosp导入androidstudio as导入sdk_xml_11

一般的接入我们不只需要unity去传入,还要接受安卓返回的数据,回调。

UnityPlayer.UnitySendMessage("Receiver", "CallUnity", "您取消了授权! ");

第一个是unity需要接受的脚本挂载的物体名字,第二个为脚本上的public方法,第三个为参数,你可以在unity这个方法中处理数据

然后有些会涉及到信息提示,比如结果状态等,可以用下边方法提示,原生的提示,一定时间后就会消失的

Toast.makeText(MainActivity.this, errorCode , Toast.LENGTH_SHORT).show();

errorcode  为你要展示的信息内容

四,打包aar

 sdk中提到的配置文件,manifest,混淆代码,路径xml等都先不管,直接打包,这些我们要放到unity中,包体在output下

aosp导入androidstudio as导入sdk_xml_12

aosp导入androidstudio as导入sdk_包名_13

然后将这个包拖到UN体验的plugins\Android 文件夹下,同样将manifest拖入,并双击打开,按照要求修改

aosp导入androidstudio as导入sdk_包名_14

导入后自定义交互脚本,调用相应的方法,进行交互.....

  交互方式:  做一个工具类,方便!

/// <summary>
/// unity 和安卓交互类
/// </summary>
public static class AndroidTools
{
    private static AndroidJavaClass jc;
    private static AndroidJavaObject jo;


    /// <summary>
    /// 发送给android的
    /// </summary>
    /// <param name="methordName"></param>
    /// <param name="args"></param>
    public static void CallAndroid(string methordName, object[] args=null)
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        if (jo == null)
        {
            Init();
        }
        if (args != null)
            jo.Call(methordName, args);
        else
            jo.Call(methordName);
#endif
    }
#if UNITY_ANDROID 
    /// <summary>
    /// 和安卓通信s
    /// </summary>
    /// <param name="methordName"></param>
    /// <returns></returns>
    public static T CallAndroid<T>(string methordName)
    {

          return jo.Call<T>(methordName);
    
    }
#endif

    /// <summary>
    /// 初始化
    /// </summary>
    private static void Init()
    {
        jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//com.unity3d.player.UnityPlayer
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");//currentActivity
    }
}

五,unity打包

   正常情况下是可以打出来的,但是更多时候是会失败的。

 1,设置keystore ,自己创建或者使用现有的,不会的 可以百度,很简单

untiy playersetting 里的包名是不能跟aar包一致的, 第一,二个框都是com.xx.xx,你的module的包名,第三个是名字,最后一个xx

       

aosp导入androidstudio as导入sdk_xml_15

3,你可能会遇到theam报错,就是安卓主题的,根据提示,打开aar包找到文件,跟主题相关的都删掉,删掉lib是下的calssses包,进res文件夹,values 的stringxml只留一个包名的代码,其他的都删掉。

aosp导入androidstudio as导入sdk_自定义_16

4,然后你又可能还会失败,Program type already present: com.crush.gogo.BuildConfig 这是你包重复了,arr中libs下的包不要在放unity里  Trying to add file to the list of ouptut files in the build report, but.... 

 如果出现一些奇怪的报错,直接再丢进去这几个包就行了,支持包

aosp导入androidstudio as导入sdk_aosp导入androidstudio_17

去这里下载:

5,还有,可能会有一些asset文件,路径啥的,按照人家说的,在plaugins/android 下创建对应的

6,如果还有问题,可以来信,一块研讨!