您好,登錄后才能下訂單哦!
原文地址:Building Plugins for Android
為android構建一個插件
要創建一個android插件,首先要有 Android NDK 并熟悉使用ndk構建共享庫的方法。
如果用C++來實現庫,必須聲明成用C語言的鏈接方式,以避免Name Mangling問題。
構建了共享庫后,必須把共享庫復制到unity3d工程中的Assets->Plugins->Android目錄下。(沒有該目錄的話,自己依次創建。)
當你在unity3d中在C#腳本中定義如下的函數時,unity3d就能通過名稱找到共享庫
當然也可以用平臺宏定義的方法,來控制與平臺相關的代碼的編譯。
部署
對于要部署到多個平臺的項目,項目工程中必須包含各個平臺所需要的插件(例如:libPlugin.so用于android平臺,Plugin.bundle用于mac平臺,Plugin.dll用于windows平臺)。unity3d會自動為目標平臺選擇正確的插件。
使用java插件
android插件機制同樣允許使用java來與android系統進行交互。
為android構建一個java插件
有好幾種方法來構建java插件,最終結果都是生成包含.class文件的.jar包。一種方法是下載 JDK,在命令行下用javac命令編譯,用jar命令打包成jar文件;另一種方法是 Eclipse+ADT。
在native代碼中使用java插件
構建好了java插件后,將java插件(.jar)復制到 unity3d工程中的
some_string
android.view.ViewGroup$LayoutParams或者android/view/ViewGroup$LayoutParams,這兩種方式都是可行的。
上面有個插件的例子是說獲取當前程序的緩存目錄的,下面這個例子直接用c#代碼做同樣的事情,而不需要任何插件:
之后就是調用的Activity的getCacheDir()得到緩存目錄的文件對象,再調用getCanonicalPath()方法獲取緩存目錄路徑的字符串表示。
當然,現在已經不需要通過這種方式來獲取緩存目錄了,因為unity3d提供了接口用以訪問程序的緩存目錄和數據目錄,也就是Application.temporaryCachePath and Application.persistentDataPath。
例子3:
最后,是一個通過UnitySendMessage方法從java代碼向腳本代碼傳遞數據的小竅門。
這里我們直接從腳本中調用的,但它確實是在java端發送的消息,它會調回到unity3d的native代碼,傳遞消息到名為"Main Camera"的游戲對象上去,該對象上綁定的某個腳本中包含有名為"JavaMessage"的方法。
在unity3d中使用java插件的最佳實踐
這一節主要針對那些沒有足夠jni,java和android經驗的人。假設我們在unity3d中使用AndroidJavaObject/AndroidJavaClass來與java交互。
首先就是要注意對AndroidJavaObject/AndroidJavaClass的任何操作都是很費時的(是通過JNI來進行的)。因此為了代碼性能和代碼清晰性,我們強烈建議托管代碼與native/java代碼間的轉換次數保持在最小數量。
你可以定義一個java方法完成所有的事情,然后我們通過AndroidJavaObject/AndroidJavaClass來與這個方法通信和獲取結果,我們的JNI幫助類會盡可能多的緩存數據已提高性能。
繼承UnityPlayerActivity java代碼
在Unity Android上,我們可以繼承標準的UnityPlayerActivity類(android上Unity Player的主要java類,類似于Unity iOS上的AppController.mm)。
應用程序可以覆寫android系統與Unity Android之間的任意交互方法,只要新建一個Activity繼承UnityPlayerActivity就可以實現。(在mac系統上,UnityPlayerActivity.java在/Applications/Unity/Unity.app/Contents/PlaybackEngines/AndroidPlayer/src/com/unity3d/player目錄下;在windows系統中,它通常在C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\src\com\unity3d\player目錄下)
首先定位Unity Android的classes.jar文件,可以在Unity3d的安裝目錄(windows下通常是C:\Program Files\Unity\Editor\Data,mac下是/Assets->Plugins->Android目錄下。 )下的子文件夾PlaybackEngines/AndroidPlayer/bin中找到,將它添加到你編譯activity的classpath中。最終編譯出來的.class文件,需要打包成.jar文件,放到工程中的Assets->Plugins->Android目錄下。因為android中manifest文件指明了啟動哪個Activity,因此我們也需要重新寫一個AndroidManifest.xml文件,也需要將它放到
繼承UnityPlayerActivity的一個例子,OverrideExample.java:
UnityPlayerNativeActivity
同樣我們可以創建UnityPlayerNativeActivity的子類,這與創建UnityPlayerActivity的子類具有相同的效果,但是會有較小的輸入延遲。但是,需要明白的是,NativeActivity是在Gingerbread中引入的(即android 2.3),老的android版本沒有這個特性,因為在NativeActivity中,觸摸事件都是在native代碼中處理的,java視圖正常情況下是無法獲取這些事件的,不過在unity3d中,有允許將事件傳到DalvikVM的轉發機制,要應用這個轉發機制,必須修改manifest文件如下:
例子
native插件例子
這里有一個簡單的使用native插件的例子。
這個例子演示了如果從unity3d android程序中來調用c代碼,包中包含了一個通過native插件計算出來的兩個數之和的場景,要注意,你必須用Android NDK來編譯這個插件。
java插件例子
這里有一個簡單的使用java代碼的例子。
這個例子演示了怎么用java代碼與android系統進行交互,以及如何用c++來將c#和java溝通起來,包中的場景顯示了一個按鈕,點擊該按鈕,會顯示出程序在android系統中的緩存目錄路徑。需要JDK和 Android NDK來編譯這個插件。
這里有一個相似的例子,但是是基于預先編譯好的JNI庫,來封裝native代碼,供c#調用。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。