在使用as接入安卓原生sdk时候,遇到了很多坑,这里做一下记录,希望帮到有缘人!
一,配置
arr包而不是jar包因为相对更方便,快捷,安全。
1:在as中创建module,选择 android lib,并设置模块名,对应的包名也是这个,所以对于有一些sdk需要在特定的包里的可以直接设置,也可以自定义包名后在创建对应的子包就可以了。
2,将要接入的sdk包放到libs文件夹下边 同时将unity的类库放入 classes.jar
放入的包需要添加依赖项,jar包可以直接右键,点击add as library ,或者去module下的build.gradle 里边配置
api 可以使用这几个:
打码的是你导入的包的名字,第三个是arr包的方式 第二个要是全路径,‘libs/’+包名
二,接入代码
大部分初始化等都需要在application或者mainactivity中,而我们刚创建的类库都是空的,需要自己定义
在你的包名右键,点击new-activity -baseactivity 创建空活动页,并自定义名字,勾上launcher,
将上图layout文件夹删除
然后去配置文件(AndroidManifest 。xml)这一部分都清掉,此时你的脚本还在报错,同样将报错的全部删除,不需要,再将appcompatActivity 改为 UnityPlayerActivity
然后你就可以接入对应的代码........
三,提供接口
按照接入指南,你只能是在安卓端的,你需要为unity提供接口调用,比如初始化init等,
定义public方法,可以带参数,如string ,int 等。来接受unity传入的数据
一般的接入我们不只需要unity去传入,还要接受安卓返回的数据,回调。
UnityPlayer.UnitySendMessage("Receiver", "CallUnity", "您取消了授权! ");
第一个是unity需要接受的脚本挂载的物体名字,第二个为脚本上的public方法,第三个为参数,你可以在unity这个方法中处理数据
然后有些会涉及到信息提示,比如结果状态等,可以用下边方法提示,原生的提示,一定时间后就会消失的
Toast.makeText(MainActivity.this, errorCode , Toast.LENGTH_SHORT).show();
errorcode 为你要展示的信息内容
四,打包aar
sdk中提到的配置文件,manifest,混淆代码,路径xml等都先不管,直接打包,这些我们要放到unity中,包体在output下
然后将这个包拖到UN体验的plugins\Android 文件夹下,同样将manifest拖入,并双击打开,按照要求修改
导入后自定义交互脚本,调用相应的方法,进行交互.....
交互方式: 做一个工具类,方便!
/// <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
3,你可能会遇到theam报错,就是安卓主题的,根据提示,打开aar包找到文件,跟主题相关的都删掉,删掉lib是下的calssses包,进res文件夹,values 的stringxml只留一个包名的代码,其他的都删掉。
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....
如果出现一些奇怪的报错,直接再丢进去这几个包就行了,支持包
去这里下载:
5,还有,可能会有一些asset文件,路径啥的,按照人家说的,在plaugins/android 下创建对应的
6,如果还有问题,可以来信,一块研讨!