最近被安排到,去做一个阅读器的App,要对接第三方的安卓和IOS的原生SDK,他们的Demo也是原生代码写的,对于第一次接触的我来说,难度有点大,而且也没人带,完全自己研究,各种网上查,跟着很多个教程做,都没成功,耗时一个星期总于可以了,在这里记录以下,
一般安卓的SDK提供的文件是aar或者jar,如果他们提供的有与unity可以交互的接口类,就直接把aar/jar文件导入到Unity工程中的Plugins/Android文件夹下面,创建脚本,根据SDK文档调用对应的方法即可。如果SDK没有提供与unity交互的接口,可以自己在AndroidStudio(下面简称AS),做一层封装,
而我用的SDK就没有与Unity交互的接口,
第一步创建新的AS工程
2、点击下一步 注意MinimumSDK 要与unity一致,(因为我的路径下已经有一个MyApplication 所以在Savelocation 在MyApplication后面加了一个3,)
3、新工程界面就是这样哒,然后点击左上角的Android切换成Project
4、在根目录右键 创建新的Module, 选着AndroidLibrary,Packagename这个是包的路径要在unity中用到,MinimumSDK要和unity保持一致
创建后的的目录
5、创建一个Class脚本 ,这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,
UnitySendMessage可以调用到Unity里的方法,第一个参数是所调用方法所挂载脚本的物体名字(区分大小写),第二个是方法名,第三个是参数
package com.sdk.mylibrary;
import android.app.Activity;
import android.widget.Toast;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class UnityAndAndroid {
private Activity _unityActivity;
Activity getActivity(){
if(null == _unityActivity) {
try {
Class> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
} catch (ClassNotFoundException e) {
} catch (IllegalAccessException e) {
} catch (NoSuchFieldException e) {
}
}
return _unityActivity;
}
boolean callUnity(String gameObjectName, String functionName, String args){
try {
Class> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
method.invoke(classtype,gameObjectName,functionName,args);
return true;
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
return false;
}
public boolean showToast(String content){
Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
//这里是主动调用Unity中的方法,
callUnity("Main Camera","FromAndroid", "hello unity i'm android");
return true;
}
//测试unity调用的方法
public int Add(int a,int b)
{
return a+b;
}
}
6、选着菜单栏Build----RebuildProject 导出aar包,然后复制aar包放到Unity的Assets/Plugins/Android目录下面,
7、创建C#脚本,把脚本挂载到相机上(因为在安卓的callUnity(“Main Camera”,“FromAndroid”, “hello unity i’m android”);这行代码中,标明了从相机上获取FromAndroid的方法),
using UnityEngine;
using UnityEngine.UI;
public class Main : MonoBehaviour {
///
/// 场景上的文本框用来显示android发送过来的内容
///
public Text text;
public Text text2;
///
/// android原生代码对象
///
AndroidJavaObject _ajc;
void Start () {
//通过该API来实例化导入的arr中对应的类
_ajc = new AndroidJavaObject("com.sdk.myunity.UnityAndAndroid");
int add = _ajc.Call("Add", 100, 2);
text2.text = add.ToString();
}
void Update () {
}
///
/// 场景上按点击时触发该方法
///
public void OnBtnClick()
{
Debug.Log("调用安卓");
//通过API来调用原生代码的方法
bool success = _ajc.Call("showToast","this is unity");
if(true == success)
{
//请求成功
}
}
///
/// 原生层通过该方法传回信息
///
///
public void FromAndroid(string content)
{
text.text = content;
}
}
8、然后打包APK 在手机上运行,即可,
下一个博客写如何接入第三方的SDK
参考链接:https://blog.csdn.net/qq_40544338/article/details/118406173



