Unity通過Jar包調用Android
我們會需要面對下面幾個問題,我們一個一個來解決:
- 怎樣在Android Studio中打Jar包
- 怎樣打一個Unity使用的Jar包
- 怎樣在Unity工程中使用這個Jar包
怎樣在Android Studio中打Jar包
在Android Studio中打Jar包首先需要保證你的工程可以順利編譯通過,之后有兩種方式:
- 使用命令行運行gradlew clean build -> jar cvf yourJarName.jar -C build/intermediates/classes/release,之后在app文件夾下就會生成一 個yourJarName.jar
- 重新設置build.gradle文件,自動生成jar包
這里我們主要來看一看第二種方法.
gradle是一個基於Apachae Ant和Apache Maven概念的項目自動化建構工具.task和project是gradle最主要的東西,所以我們可以建立一個task,調用jar命令幫我們生成jar包,具體代碼如下:
//定義一個函數,target是生成jar包的文件名,classDir是class文件所在的文件夾def makeJar(String target,String classDir){exec{executable "jar"//調用jarargs "cvf",targetargs "-C", classDirargs "","."}}//新建一個task,名為buildLib,依賴build(build是一個自帶的task)task buildLib(dependsOn:['build'])<<{makeJar("class.jar","build/intermediates/classes/release")}task buildJar(){makeJar("ASTest.jar","build/intermediates/classes/release")}
打開底部任務欄的Terminal,輸入gradlew buildLib,執行完之后在你的app文件下就會出現想要的jar包

怎樣打一個Unity使用的Jar包
使用Android Studio新建一個空工程,首先我們需要將接口class.jar引入到工程libs文件夾下.接口包所在地C:\Program Files\Unity5.2.3\Editor\Data\PlaybackEngines\androidplayer\Variations\mono\Release\Classes\class.jar,工程目錄結構如下圖:
(按照上一節的方法設置build.gradle文件)

開始編寫JAVA代碼
UnityTestActivity.java
package com.xys.unitytestactivity;import android.content.Context;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.os.Bundle;import com.unity3d.player.UnityPlayerActivity;publicclassUnityTestActivityextendsUnityPlayerActivity{/** Called when the activity is first created. */Context mContext =null;@Overridepublicvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);mContext =this;}publicstaticint num =0;publicstaticintGetNum(){num++;return num;}publicint obtainWifiStrength(){WifiManager wifi_servicve =(WifiManager) getSystemService(WIFI_SERVICE);WifiInfo connectionInfo = wifi_servicve.getConnectionInfo();int level = connectionInfo.getRssi();return level;}}
UnityTestActivity是主Activity,Unity程序一啟動就會調用這個Activity,他是在AndroridManifest.xml中配置的.他需要繼承UnityPlayerActivity,就是我們剛剛引入的class.jar包中的接口類.接着我們配置本程序的AndroidManifest.xml,這個很重要,一定要配置.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android"package="com.xys.unitytestactivity"><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><applicationandroid:allowBackup="true"android:icon="@drawable/icon"android:label="@string/app_name"android:supportsRtl="true"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><activityandroid:name=".UnityTestActivity"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>
之后按照上一節的打包流程,打出Jar包.
注意:在這有一個坑,需要將build\intermediates\classes\release\com\你的包名\你的工程名 下面的R開頭的class文件全部刪掉,不然在Unity中使用打包時會報錯
怎樣在Unity工程中使用這個Jar包
開始創建Unity工程.如圖所示,Plugins->Android,將AndroidMinifest.xml放入這一層文件夾並建立res文件夾(下面放打包時需要用到的資源,如APP的圖標等)和bin文件夾(放剛剛生成的.jar包)
注意:Jar包的名字可以隨便修改,但是jar包里面必須是com\你的包名\你的工程名\你需要的class,否則運行程序后提示找不到類文件
在Unity中新建一個Test.cs
Test.cs
usingUnityEngine;usingUnityEngine.UI;usingSystem;publicclassTest:MonoBehaviour{privatestaticfloat xValue;privatestaticfloat yValue;privatestaticfloat zValue;publicText myText;privateString wifiStrength;privateAndroidJavaClass jc;privateAndroidJavaObject jo;voidStart(){jc =newAndroidJavaClass("com.unity3d.player.UnityPlayer");jo = jc.GetStatic<AndroidJavaObject>("currentActivity");}// Update is called once per framevoidUpdate(){if(Input.GetKey(KeyCode.Escape)){Application.Quit();}xValue = jo.CallStatic<int>("GetNum");yValue = jo.Call<int>("obtainWifiStrength");ChangeWifiStrength();}privatevoidChangeWifiStrength(){if(wifiStrength != yValue.ToString())wifiStrength = yValue.ToString();myText.text =string.Format("wifi strength :{0}", wifiStrength);}}
打包注意:Unity中PlayerSetting的Bundle Identifier要與Android工程保持一致,否則無法調用
打包到真機上,現在能夠顯示WIFI強度了
