unity 调用android函数

  • Post author:
  • Post category:其他


我们知道,安卓工程都有一个AndroidManifest.xml,里面指定了启动Activity等信息。u3d里我们并没有给出这个文件,可见,一定是它在编译的时候,自动为我们添加了这些文件。
如何知道unity还为我们添加了什么文件,每个文件中有什么内容呢?.apk文件其实就是一个压缩包,在win上用win rar就能打开这个包。下图是apk包的内容。若要知道每个文件的具体内容,就必须解析出apk,可以借助AndroidMutiltool(点击下载)工具。这里提供了一个unity 导出的apk和用andoridMuting工具解析出的文件(点击此处下载文件)

	从上图可以看到,u3d为我们添加了一个AndroidManfiest.xml。那么如何使用我们自定义的AndroidManifest.xml呢?很简单,只需要将自定义的Androidmanifest.xml放到指定的位置就可以了,至于具体什么位置,待会再说。



下面开始切入正题。

	unity如何调用android工程中的函数?思路是这样的:
		第一、自定义启动Activity。(从上面的AndroidManifest.xml可知unity默认的启动Activity是UnityPlayerNativeActivity)。若要此工程从自定义activity启动,就需要自定义的AndroidManifest.xml。但unity不能直接编译执行java文件,所以要把MainActivity编译,打包成jar库,引入unity。
		第二、调用Activity中函数。unity全程只有一个Activity,所以我们可以通过获取当前Activity来获取activity对象,通过jni调用activity的函数。
	
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");

	有了思路,下面开始动手实现。
	1、打开eclipse,新建android工程test001。记住包名(package name)后面会用。
	2、将unity下的android库classes.jar复制到工程test001的libs目录下。classes.jar路径:安装盘\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下。
		
	3、将classes.jar添加到java build path。
		方法有两种。①右键classes.jar -> build path -> add to build path。②工程->属性->java build path -> libraries -> addJars
		
	4、修改MainActivity.java。
		注意:setContentView(...)这句如果不注释掉,你看到的将会是android工程的hello world界面。
		
	5、编译工程。
	6、打包.class文件。 
		进入工程目录/bin/classes。里面有一个com文件下,该文件夹里存了多个.class文件。现在要将com文件夹打包。在classes下执行jar -cvf myclasses.jar com。
	7、用unity新建项目test001,在Assets目录中新建下列目录
		
		myclasses.jar复制到bin下。将AndroidManifest.xml复制到Android目录下。将res目录复制到Android目录下。
	8、在Assets目录下新建一个c#脚本,关联到主相机。脚本内容如下
		
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {

	private AndroidJavaObject m_jo;
	// Use this for initialization
	void Start () {
		Debug.Log ("start***");
		AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
		m_jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
		if (m_jo != null)
						Debug.Log (m_jo);
				else
						Debug.Log ("get static object fail ***");
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnGUI () {
		if (GUI.Button (new Rect (100, 100, 100, 50), "test_2")) {
			Debug.Log ("tset_2");
			Debug.Log( "the result is : " + m_jo.Call<int>("times_2", 5) );
		}

		if (GUI.Button (new Rect (100, 200, 100, 50), "test_3")) {
			Debug.Log ("tset_3");
			Debug.Log( "the result is : " + m_jo.Call<int>("times_3", 5) );
		}
	}
}

	9、编译运行。
		编译时,点BuildSetting -> Player Setting -> other Setting -> Bundle Identifier,将此项值设置为上面第①条提到的包名

	10、查看输出log。
		log信息要通过logcat查看。进入android sdk下的platform-tools目录,里边有个adb.exe。执行命令./adb.exe logcat就可以看到log信息了。


	我上传了这个工程需要用到的文件(如xml,myclasses.jar,res/)。还包含了MainActivity.java文件便于理解。http://download.csdn.net/detail/u012085988/6741421



版权声明:本文为u012085988原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。