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

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

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