前言
項目之前使用Eclipse導出的jar文件來做與Android交互,最近因為工作需要需使用Android Studio的aar文件,網上參考了部分文章,也結合自己的理解重新整理一下具體的方法,通過寫一個測試Demo來表述Android Studio創建aar的過程與及Unity如何使用aar文件,希望對剛好有這個需求的人能起到部分幫助與引導,同時如果文中有誤希望也能不吝賜教。
版本信息
Unity 5.3.1f1,
Android Studio 2.2.3
Android Studio導出可供Unity使用的aar插件
一、 創建Android Studio工程






二、添加Unity的classes.jar引用
1)把Unity引擎目錄下中的”Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar“文件拷貝至Android Studio工程中的libs目錄
2)右擊"Project"視圖,打開"Open Module Settings", 添加“classes.jar”依賴
三、編寫Android側代碼(修改MainActivity代碼)
import android.os.Bundle; import android.widget.Toast; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // 顯示Toast消息 public void ShowToast(final String message){ runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); } }); } // 返回一個字符串(靜態方法) public static String GetInformation() { return "This is a Plugin's content!"; } }
四、修改build.gradle,設置工程導出為aar
2)刪除 applicationId "com.zcode.unityandroidplugindemo"
3)修改后的build.gradle為
apply plugin: 'com.android.library' android { compileSdkVersion 24 buildToolsVersion "24.0.1" defaultConfig { minSdkVersion 18 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:24.1.1' testCompile 'junit:junit:4.12' compile files('libs/classes.jar') }
五、修改AndroidManifest.xml




六、導出供Unity使用的*.aar文件
1)點擊“Build -> Build APK”,生成aar文件
2)由於Unity在打包APK時會自動包含自身的classes.jar,所以需使用壓縮軟件打開aar文件刪除libs目錄下的classes.jar文件
Unity導入插件,並調用
一、創建Unity工程
二、導入插件到Unity工程中

三、編寫測試代碼
1)新建一個“Call.cs”的腳本文件
2)在“Call.cs”腳本中編寫調用Android側代碼
using UnityEngine; using System.Collections; public class Call : MonoBehaviour { string information_ = null; void OnGUI() { //調用顯示一個文本為“Hello World!”的Toest if(GUI.Button(new Rect(0, 0, 200, 20), "Show Toest - Hello World!")) { //Unity側調用Android側代碼 using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) { //調用成員方法 jo.Call("ShowToast", "Hello World!"); } } } //獲得插件側的返回字符串 if (GUI.Button(new Rect(0, 40, 200, 20), "Get Plugin's Information")) { //Unity側調用Android側代碼 using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) { //調用靜態方法 information_ = jo.CallStatic<string>("GetInformation"); } } } //顯示返回的字符串 GUI.Label(new Rect(220, 40, Screen.width - 220, 20), information_); } }
四、導出APK
五、測試
Demo地址
http://pan.baidu.com/s/1dFxc7JF
結尾
Android側調用Unity側的方式在此就不多做贅述,網上相關的文章也很多。
Android插件工程中使用第三方的aar庫中遇到的Bug解決方案
1.需手動拷貝至Unity項目Plugin/Android目錄下,不然會找不到該庫引起NoClassDefFoundError的錯誤,導致項目真機引起宕機(PS:Unity打包APk時並不會檢查Android插件中是否完整包含其它aar庫)
2.確定所有的aar庫中的android:minSdkVerion與android:targetSdkVersion一致