我們知道,安卓工程都有一個(gè)AndroidManifest.xml,里面指定了啟動(dòng)Activity等信息。u3d里我們并沒(méi)有給出這個(gè)文件,可見(jiàn),一定是它在編譯的時(shí)候,自動(dòng)為我們添加了這些文件。
如何知道unity還為我們添加了什么文件,每個(gè)文件中有什么內(nèi)容呢?.apk文件其實(shí)就是一個(gè)壓縮包,在win上用win rar就能打開(kāi)這個(gè)包。下圖是apk包的內(nèi)容。若要知道每個(gè)文件的具體內(nèi)容,就必須解析出apk,可以借助AndroidMutiltool(點(diǎn)擊下載)工具。這里提供了一個(gè)unity 導(dǎo)出的apk和用andoridMuting工具解析出的文件(點(diǎn)擊此處下載文件)。
從上圖可以看到,u3d為我們添加了一個(gè)AndroidManfiest.xml。那么如何使用我們自定義的AndroidManifest.xml呢?很簡(jiǎn)單,只需要將自定義的Androidmanifest.xml放到指定的位置就可以了,至于具體什么位置,待會(huì)再說(shuō)。
unity如何調(diào)用android工程中的函數(shù)?思路是這樣的:
第一、自定義啟動(dòng)Activity。(從上面的AndroidManifest.xml可知unity默認(rèn)的啟動(dòng)Activity是UnityPlayerNativeActivity)。若要此工程從自定義activity啟動(dòng),就需要自定義的AndroidManifest.xml。但unity不能直接編譯執(zhí)行java文件,所以要把MainActivity編譯,打包成jar庫(kù),引入unity。
第二、調(diào)用Activity中函數(shù)。unity全程只有一個(gè)Activity,所以我們可以通過(guò)獲取當(dāng)前Activity來(lái)獲取activity對(duì)象,通過(guò)jni調(diào)用activity的函數(shù)。
- AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
- AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentActivity");
有了思路,下面開(kāi)始動(dòng)手實(shí)現(xiàn)。
1、打開(kāi)eclipse,新建android工程test001。記住包名(package name)后面會(huì)用。
2、將unity下的android庫(kù)classes.jar復(fù)制到工程test001的libs目錄下。classes.jar路徑:安裝盤(pán)\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin下。

3、將classes.jar添加到j(luò)ava build path。
方法有兩種。①右鍵classes.jar -> build path -> add to build path。②工程->屬性->java build path -> libraries -> addJars

4、修改MainActivity.java。
注意:setContentView(...)這句如果不注釋掉,你看到的將會(huì)是android工程的hello world界面。

5、編譯工程。
6、打包.class文件。
進(jìn)入工程目錄/bin/classes。里面有一個(gè)com文件下,該文件夾里存了多個(gè).class文件?,F(xiàn)在要將com文件夾打包。在classes下執(zhí)行jar -cvf myclasses.jar com。
7、用unity新建項(xiàng)目test001,在Assets目錄中新建下列目錄

將myclasses.jar復(fù)制到bin下。將AndroidManifest.xml復(fù)制到Android目錄下。將res目錄復(fù)制到Android目錄下。
8、在Assets目錄下新建一個(gè)c#腳本,關(guān)聯(lián)到主相機(jī)。腳本內(nèi)容如下
- 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、編譯運(yùn)行。
編譯時(shí),點(diǎn)BuildSetting -> Player Setting -> other Setting -> Bundle Identifier,將此項(xiàng)值設(shè)置為上面第①條提到的包名
10、查看輸出log。
log信息要通過(guò)logcat查看。進(jìn)入android sdk下的platform-tools目錄,里邊有個(gè)adb.exe。執(zhí)行命令./adb.exe logcat就可以看到log信息了。
我上傳了這個(gè)工程需要用到的文件(如xml,myclasses.jar,res/)。還包含了MainActivity.java文件便于理解。http://download.csdn.net/detail/u012085988/6741421
聯(lián)系客服