Unity與Android(Android Studio)交互及遇到的問題

現(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寸莫,重啟模擬器,再不行档冬,換另一個模擬器就好了膘茎,有其他小伙伴遇到這個問題嗎?告訴我解決方法酷誓,謝謝披坏!

  1. 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攻旦,需要以下條件:

  1. 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包的方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末结缚,一起剝皮案震驚了整個濱河市损晤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌红竭,老刑警劉巖沉馆,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件码党,死亡現(xiàn)場離奇詭異,居然都是意外死亡斥黑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門眉厨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌奴,“玉大人,你說我怎么就攤上這事憾股÷故瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵服球,是天一觀的道長茴恰。 經(jīng)常有香客問我,道長斩熊,這世上最難降的妖魔是什么往枣? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮粉渠,結(jié)果婚禮上分冈,老公的妹妹穿的比我還像新娘。我一直安慰自己霸株,他們只是感情好雕沉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著去件,像睡著了一般坡椒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尤溜,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天倔叼,我揣著相機(jī)與錄音,去河邊找鬼靴跛。 笑死缀雳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梢睛。 我是一名探鬼主播肥印,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绝葡!你這毒婦竟也來了深碱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藏畅,失蹤者是張志新(化名)和其女友劉穎敷硅,沒想到半個月后功咒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞蹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年力奋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幽七。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡景殷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澡屡,到底是詐尸還是另有隱情猿挚,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布驶鹉,位于F島的核電站绩蜻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏室埋。R本人自食惡果不足惜办绝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望词顾。 院中可真熱鬧八秃,春花似錦、人聲如沸肉盹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上忍。三九已至骤肛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窍蓝,已是汗流浹背腋颠。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吓笙,地道東北人淑玫。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像面睛,于是被迫代替她去往敵國和親絮蒿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容