#1.在AS中新建Empty Activity工程

#2.在Android视图下选中app右键选中Module,创建新的 Android Library



后续只对mysdk模块进行操作。
#3、引入Unity对接Android的库文件
导入classes.jar文件:
2018版本中路径为:C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\classes.jar
将classes.jar粘贴到mysdk模块的libs目录下**(需要将工程切换到project视图)**

这个classes.jar文件就被引入到工程后,展开三角,可以看到如下三个模块,其中就有com.unity3d.player。

4、创建本模块的Activity文件

展开mysdk模块下的src目录,选中com.***.mysdk,然后右键,新建一个Activity,选择Empty Activity,输入Activity Name以及Package Name和Language,勾掉Generate Layout File, 完成。


脚本初始为:

package com.example.mysdk;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class PrMainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

}

现将SDKMainActivity脚本内容修改为继续自UnityPlayerActivity ,并添加两个方法 UnityCallAndroid 和 AndroidCallUnity,

package com.example.mysdk;

import android.os.Bundle;
import android.widget.Toast;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class SDKMainActivity extends UnityPlayerActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

//unity调用Android
public void UnityCallAndroid () {

    Toast.makeText(this,"unity调用android成功", Toast.LENGTH_LONG).show();

    AndroidCallUnity();
}

//android调用unity
public void AndroidCallUnity () {

    //第1个参数为Unity场景中用于接收android消息的对象名称
    //第2个参数为对象上的脚本的一个成员方法名称(脚本名称不限制)
    //第3个参数为unity方法的参数
    UnityPlayer.UnitySendMessage("receiveObj", "UnityMethod", "This is args.");
}

}

#5、将模块打包
打包方法有两种。

一是手动进行构建,然后在Build/intermediates/packaged-classes/release目录下找到相应的jar包(这个jar包默认名称为classes.jar,为了区分,需要自己改名称);

二是用gradle命令。

打开本模块的build.gradle文件,在文件尾添加如下的一组命令。

//----------------这是一组将module导出为jar的gradle命令-------------------
// mysdk为自定义的jar包名称
//task to delete the old jar
task deleteOldJar(type: Delete) {
delete 'release/mysdk.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
from('build/intermediates/packaged-classes/release/')
into('release/')
include('classes.jar')
///Rename the jar
rename('classes.jar', 'mysdk.jar')
}

exportJar.dependsOn(deleteOldJar, build)
//---------------------------命令结束------------------------------

build.gradle文件修改后,会提示要求同步,直接同步即可。同步结束,在IDE右上点开Gradle窗口,在other下找到exportJar命令。在mysdk/release/目录下得到生成的jar包。


#6、修改AndroidManifest.xml文件

文件初始只有一对application标签和activity标签
修改为:

<application android:label="MySDK">
    <activity android:name="com.example.mysdk.PrMainActivity"></activity>
    <!-- 这个android:name的值必须为包名+类名 -->
    <activity android:name="com.example.mysdk.SDKMainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <!-- 这一行不能少,否则会闪退 -->
        <meta-data
            android:name="unityplayer.UnityActivity"
            android:value="true" />
    </activity>
</application>

#在unity中使用jar文件
新建一个Unity工程,在Assets目录下新建Plugins/Android/bin目录。
AndroidManifest.xml文件拷贝到Assets/Plugins/Android目录下
mysdk.jar文件拷贝到Assets/Plugins/Android/bin目录下

#制作测试UI界面

receiveObj的名称必须与SDKMainActivity类的AndroidCallUnity方法中的UnityPlayer.UnitySendMessage方法的第一个参数保持一致。

创建SDKTest脚本挂载到receiveObj上

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

public class SDKTest : MonoBehaviour
{
private AndroidJavaClass jc;
private AndroidJavaObject jo;

private Button btn;
private Text text;

private void Awake()
{
    btn = transform.Find("Button").GetComponent<Button>();
    text = transform.Find("Text").GetComponent<Text>();

    //这两行是固定写法
    jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

    btn.onClick.AddListener(OnBtnClickHandler);
}

private void OnBtnClickHandler()
{
    //调用Android中的方法UnityCallAndroid
    jo.Call("UnityCallAndroid");
}

/// <summary>
///  被Android中AndroidCallUnity调用
/// </summary>
/// <param name="str"></param>
public void UnityMethod(string str)
{
    Debug.Log("UnityMethod被调用,参数:" + str);
    text.text = str;
}

}

#打包并测试。