現(xiàn)在android開發(fā)都轉(zhuǎn)到android studio上了, unity與android交互匕累,如unity打開android的界面(activity),當(dāng)eclipse工程轉(zhuǎn)到android studio時遇上java.lang.NoSuchMethodError, 網(wǎng)上找了很多資料查到的都是簡單的例子如打開android的Toast冈钦, Dialog与倡,官方文檔也比較少界逛,android新手折騰了幾天終于搞定了,特寫此文記錄一下纺座。
Android新手在開發(fā)工具的選擇上果斷用了Android Studio息拜,確實(shí)好用。
一净响、Unity與Androd交互參考:
我的需求是用android開發(fā)sdk少欺,供unity游戲使用。
1. android項(xiàng)目新建2個activity馋贤,主activity繼承UnityplayerActivity赞别,作為與Unity交互的接口,
2. 主activity中提供打開新activity的接口配乓。
3. Unity創(chuàng)建若干按鈕仿滔,打開android的Toast, 和多種方式打開android的界面(activity)犹芹。
4. android打包aar和androidmanifest.xml放入Unity項(xiàng)目的Assets/Plugin
5. unity打出apk包崎页,安裝在海馬玩或mumu模擬器中。
6. android studio打開Android monitor查看模擬器的adb log腰埂,
模擬器時不時掉線飒焦,還連不上,可重啟android monitor和模擬器試試屿笼。
Unity與Android交互參考下面幾個鏈接:
1.實(shí)現(xiàn)Unity和Android進(jìn)行交互
2.Android Native Plugin: From Android Studio to Unity
3.BUILDING ANDROID PLUGINS WITH UNITYPLAYERACTIVITY
4.Unity3D游戲開發(fā)之Unity與Android交互調(diào)用研究
這個是Eclipse 工程結(jié)構(gòu)的
5.https://www.thepolyglotdeveloper.com/2014/06/creating-an-android-java-plugin-for-unity3d/
6.https://library.vuforia.com/articles/Solution/How-To-Use-Android-Plugins-in-Unity-Apps
7.http://www.xuanyusong.com/archives/667
Unity3D研究院之打開Activity與調(diào)用JAVA代碼傳遞參數(shù)
看這幾個例子就夠了牺荠,有的是含有demo的翁巍,可下載。
希望是美好的志电,過程是痛苦的曙咽,作為組內(nèi)第一個吃螃蟹的人,坑是不少的挑辆,下面我們一個個來踩踩例朱。
二、遇到的問題
1. Unity 打Android包錯誤: Invalid command android鱼蝉,
解決方案:更換sdk tools到25.2.3
參考如下:Unity編譯時找不到AndroidSDK的問題 | Unable to list target platforms
http://www.reibang.com/p/fe4c334ee9fe
2.Android調(diào)試洒嗤,方法有多種:
Android Studio自帶ADT;Eclipse + adt魁亦;也可adb控制臺查看 #adb logcat渔隶。
我在windows上裝了android模擬器,海馬玩洁奈,mumu都可以间唉;也可用真機(jī)調(diào)試。
adb log利术,試過控制臺呈野,總是找不到模擬器.
一般是端口問題,需要手工指定端口印叁,比較麻煩被冒,棄之。
試AS自帶的Android Monitor轮蜕,立馬連上了
如下圖所示昨悼,右邊開著海馬玩模擬器運(yùn)行android apk,左邊是顯示的adb log跃洛。
然而率触,問題來了:AS會經(jīng)常顯示顯示offline 或者disconnect,明明剛剛用的好好的汇竭,怎么突然不行了闲延。一度懷疑過是不是剛打包問題改了sdk版本導(dǎo)致的,重新更換回去也不行韩玩。
接著試試各種方法:
1). adb restart
2). 更新 sdk tools, sdk platform tools
陆馁。找颓。。
還是不行叮贩,
換個mumu模擬器就好了击狮,經(jīng)多次實(shí)踐發(fā)現(xiàn) AS adb調(diào)試佛析,設(shè)備會是不是連不上,我的解決方法很暴力彪蓬,重啟AS寸莫,重啟模擬器,再不行档冬,換另一個模擬器就好了膘茎,有其他小伙伴遇到這個問題嗎?告訴我解決方法酷誓,謝謝披坏!
- unity打android包之后,模擬器安裝運(yùn)行運(yùn)行盐数。
unity調(diào)用android打開Toast棒拂,Dialog,打log都沒問題玫氢,但是打開android的activity時找不到class帚屉,報錯:
No package identifier when getting name for resource number 0x00000000
Caused by: java.lang.NoClassDefFoundError: com.test.unity.Main2Activity
這個是重磅錯誤,打開jar包發(fā)現(xiàn)class明明就在里面
先說我的解決方法:
經(jīng)過各種嘗試發(fā)現(xiàn)漾峡,unity要打開android studio的activity攻旦,需要以下條件:
- android studio 打出aar包 + unity5.x (支持aar包) ,必須用aar包 + AndroidManifest.xml灰殴,android studio打出的aar包解壓后得到的jar文件敬特,
內(nèi)部是沒有R.class文件的,會導(dǎo)致找不到資源牺陶,猜測若要使用eclipse的工程結(jié)構(gòu)伟阔,需想辦法打出包含R.class的jar包,目前未嘗試掰伸。
2.Android 主activity 需繼承AndroidPlayerActivity
3.AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObjectjo=jc.GetStatic("currentActivity"); jo.Call("方法");
必須使用UnityPlayer皱炉,然后獲取currentActivity,再去調(diào)用方法狮鸭。
分析AS 與Eclipse導(dǎo)出android包的區(qū)別:
AS打jar包有2種方式合搅,
在gradle文件中寫命令:task makeJar(type: Copy)
{ delete'build/libs/mysdk.jar' from('build/intermediates/bundles/release/') into('build/libs/') include('classes.jar') rename('classes.jar','mysdk.jar') }
makeJar.dependsOn(build)//在終端執(zhí)行生成JAR包// gradlew makeJar
在Terminal中鍵入 gradlew makeJar 回車看到如下所示就OK了:
build 出aar包,解壓縮得到j(luò)ar包歧蕉;
這里我采用的第二種方式灾部。
unity也支持兩種結(jié)構(gòu)的android plugin,
unity4.x支持eclipse工程結(jié)構(gòu)的android plugin惯退,
unity5.x即支持eclipse工程結(jié)構(gòu)的android plugin赌髓,也支持android studio導(dǎo)出的aar包 + AndroidManifest.xml。
兩種方式都試過,容我細(xì)細(xì)道來锁蠕。
1. AS打出的jar包有問題夷野?
找到的例子里都是用的Eclipse工程結(jié)構(gòu),(UNITY3D游戲開發(fā)之UNITY與ANDROID交互調(diào)用研究)這個例子里unity能夠正常打開android的界面荣倾,有demo可下載悯搔。
于是將AS的android包與eclipse工程的plugins/Android 包比較,發(fā)現(xiàn)jar包不同舌仍,AS的jar包里缺少了R.class妒貌。
那么AS怎樣才能打出帶R.class的jar包? 目前未嘗試成功
2. Android 主activity 需繼承AndroidPlayerActivity
如果Android項(xiàng)目需要用到android 的activity抡笼,主Activity.java 是需要繼承AndroidPlayerActivity的苏揣;
3. unity調(diào)用Android接口的方式:
1)AndroidJavaClassjc =newAndroidJavaClass("com.test.unity.MainActivity");
jc.Call("init");
2)AndroidJavaClassjc=newAndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObjectjo=jc.GetStatic("currentActivity");
jo.Call("showToast","Showing on Toast");
1)直接使用真實(shí)的Class名:com.test.unity.MainActivity"
2)使用UnityPlayer,然后獲取currentActivity推姻,再去調(diào)用方法平匈。
結(jié)論: 簡單的功能,如打印日志藏古,打開android的Toast增炭, dialog,兩種方法都可以拧晕,但是打開android activity必須使用2)隙姿,1)無法打開。
4 Unity調(diào)用Android的靜態(tài)和非靜態(tài)方法
public void AndroidCallNonStatic() { using (AndroidJavaClass javaClass = new AndroidJavaClass("com.codestalkers.plugin.Main")) { using (AndroidJavaObject activity = javaClass.GetStatic("mContext")) { activity.Call("nonStaticMethod"); } } }
publicvoidAndroidCallStatic(){ using(AndroidJavaClass javaClass =newAndroidJavaClass("com.codestalkers.plugin.Main")){ javaClass.CallStatic("StaticMethod"); } }
5. Android 哪些方法需要runOnUiThread:
public voidstartActivity1() { runOnUiThread(newRunnable() { @Override public void run() { Intent intent =newIntent(mContext,Main2Activity.class); mContext.startActivity(intent); } });}
public voidshowAndroidUI() { Intent intent =newIntent(mContext,Main2Activity.class); this.startActivity(intent); }
startActivity采用上述兩種方式都能夠在unity中打開厂捞,區(qū)別有待研究输玷。
6)Android向Unity發(fā)消息
Android代碼:
UnityPlayer.UnitySendMessage("GameManager","HelloFromAndroid","Hello!");
Unity代碼:
usingUnityEngine; publicclassGameManager : MonoBehaviour { publicvoidHelloFromAndroid(stringdataReceived) { Debug.Log("Received data from Android plugin: "+ dataReceived); } }
7.解決NoClassDefFoundError問題的過程中還會遇到下面問題
java.lang.NoClassDefFoundError: com.test.unity.R$layout 找不到資源文件
java.lang.NoSuchMethodError 找不到方法,
按照上述我的解決方法可以解決這些報錯:
目前的方案只是一種解決辦法靡馁,
要想使用Eclipse工程結(jié)構(gòu)的android包欲鹏,主要問題還是在jar包上,解壓aar包發(fā)現(xiàn)有R.txt臭墨,而解壓出的jar包沒有R.class赔嚎,若想使用eclipse的工程結(jié)構(gòu)的android包,就需要打出合適的jar包胧弛,無奈嘗試gradle makeJar出錯尤误,待有時間再試試這種直接build jar包的方法。