首先新建一个android工程
包名与unity的包名相同
比如我这里叫com.example.myjavatest好了
然后引入Unity的classes.jar包
classes.jar包在Unity安装目录\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes
我们的android的主Activity必须继承UnityPlayerActivity,例子如下
package com.example.myjavatest;
import android.content.Context;
import android.os.Bundle;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class HelloActivity extends UnityPlayerActivity
{
Context m_context = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
m_context = this;
}
public void OnUnityCall(String name)
{
UnityPlayer.UnitySendMessage("JavaMsgRecver", "OnJavaMsg","hello,I got your msg:"+name);
}
}
然后把android工程的src也就是代码部分Export成一个jar包
把生成的jar包丢到Unity工程中的Plugins/Android/bin目录下
注意吧AndroidManifest.xml也搞过去,要稍微改一下,例:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myjavatest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:debuggable="false"
android:allowBackup="false">
<activity
android:name=".HelloActivity"
android:label="@string/app_name"
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
android:launchMode="singleTop"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
然后在Unity中创建一个叫JavaMsgRecver的GameObject,挂上如下脚本
using UnityEngine;
public class Startup : MonoBehaviour
{
void Start ()
{
Debug.Log("Startup");
using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
Debug.Log("get AndroidJavaClass");
using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity"))
{
Debug.Log("get AndroidJavaObject Begin");
jo.Call("OnUnityCall", "I am Unity");
Debug.Log("get AndroidJavaObject End");
}
}
}
public void OnJavaMsg(string msg)
{
Debug.Log("OnJavaMsg");
Debug.Log(msg);
}
}
运行效果如下
补充:如果不需要跟主Activity的对象进行交互,那么,就不用继承UnityPlayerActivity啦,包名也不用跟Unity工程的包名相同,在Java中写好静态接口,然后导成jar包,在C#中直接用AndroidJavaClass调用静态接口即可
例:
using(AndroidJavaClass jc = new AndroidJavaClass("com.lxf.myjava"))
{
jc.CallStatic("OnUnityCall","I am Unity!");
}