Unity經過Jar包調用Android

Unity經過Jar包調用Android

咱們會須要面對下面幾個問題,咱們一個一個來解決:java

  1. 怎樣在Android Studio中打Jar包
  2. 怎樣打一個Unity使用的Jar包
  3. 怎樣在Unity工程中使用這個Jar包

怎樣在Android Studio中打Jar包

在Android Studio中打Jar包首先須要保證你的工程能夠順利編譯經過,以後有兩種方式:android

  • 使用命令行運行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包,具體代碼以下:app

  1. //定義一個函數,target是生成jar包的文件名,classDir是class文件所在的文件夾
  2. def makeJar(String target,String classDir){
  3. exec{
  4. executable "jar"//調用jar
  5. args "cvf",target
  6. args "-C", classDir
  7. args "","."
  8. }
  9. }
  10. //新建一個task,名爲buildLib,依賴build(build是一個自帶的task)
  11. task buildLib(dependsOn:['build'])<<{
  12. makeJar("class.jar","build/intermediates/classes/release")
  13. }
  14. task buildJar(){
  15. makeJar("ASTest.jar","build/intermediates/classes/release")
  16. }

打開底部任務欄的Terminal,輸入gradlew buildLib,執行完以後在你的app文件下就會出現想要的jar包
ide

怎樣打一個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工具

  1. package com.xys.unitytestactivity;
  2. import android.content.Context;
  3. import android.net.wifi.WifiInfo;
  4. import android.net.wifi.WifiManager;
  5. import android.os.Bundle;
  6. import com.unity3d.player.UnityPlayerActivity;
  7. publicclassUnityTestActivityextendsUnityPlayerActivity{
  8. /** Called when the activity is first created. */
  9. Context mContext =null;
  10. @Override
  11. publicvoid onCreate(Bundle savedInstanceState){
  12. super.onCreate(savedInstanceState);
  13. mContext =this;
  14. }
  15. publicstaticint num =0;
  16. publicstaticintGetNum()
  17. {
  18. num++;
  19. return num;
  20. }
  21. publicint obtainWifiStrength(){
  22. WifiManager wifi_servicve =(WifiManager) getSystemService(WIFI_SERVICE);
  23. WifiInfo connectionInfo = wifi_servicve.getConnectionInfo();
  24. int level = connectionInfo.getRssi();
  25. return level;
  26. }
  27. }

UnityTestActivity是主Activity,Unity程序一啓動就會調用這個Activity,他是在AndroridManifest.xml中配置的.他須要繼承UnityPlayerActivity,就是咱們剛剛引入的class.jar包中的接口類.接着咱們配置本程序的AndroidManifest.xml,這個很重要,必定要配置.
AndroidManifest.xmlgradle

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.xys.unitytestactivity">
  4. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
  5. <application
  6. android:allowBackup="true"
  7. android:icon="@drawable/icon"
  8. android:label="@string/app_name"
  9. android:supportsRtl="true"
  10. android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
  11. <activityandroid:name=".UnityTestActivity">
  12. <intent-filter>
  13. <actionandroid:name="android.intent.action.MAIN"/>
  14. <categoryandroid:name="android.intent.category.LAUNCHER"/>
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. </manifest>

以後按照上一節的打包流程,打出Jar包.
注意:在這有一個坑,須要將build\intermediates\classes\release\com\你的包名\你的工程名 下面的R開頭的class文件所有刪掉,否則在Unity中使用打包時會報錯ui

怎樣在Unity工程中使用這個Jar包

開始建立Unity工程.如圖所示,Plugins->Android,將AndroidMinifest.xml放入這一層文件夾並創建res文件夾(下面放打包時須要用到的資源,如APP的圖標等)和bin文件夾(放剛剛生成的.jar包)
注意:Jar包的名字能夠隨便修改,可是jar包裏面必須是com\你的包名\你的工程名\你須要的class,不然運行程序後提示找不到類文件

在Unity中新建一個Test.cs
Test.csthis

  1. usingUnityEngine;
  2. usingUnityEngine.UI;
  3. usingSystem;
  4. publicclassTest:MonoBehaviour
  5. {
  6. privatestaticfloat xValue;
  7. privatestaticfloat yValue;
  8. privatestaticfloat zValue;
  9. publicText myText;
  10. privateString wifiStrength;
  11. privateAndroidJavaClass jc;
  12. privateAndroidJavaObject jo;
  13. voidStart()
  14. {
  15. jc =newAndroidJavaClass("com.unity3d.player.UnityPlayer");
  16. jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
  17. }
  18. // Update is called once per frame
  19. voidUpdate()
  20. {
  21. if(Input.GetKey(KeyCode.Escape))
  22. {
  23. Application.Quit();
  24. }
  25. xValue = jo.CallStatic<int>("GetNum");
  26. yValue = jo.Call<int>("obtainWifiStrength");
  27. ChangeWifiStrength();
  28. }
  29. privatevoidChangeWifiStrength()
  30. {
  31. if(wifiStrength != yValue.ToString())
  32. wifiStrength = yValue.ToString();
  33. myText.text =string.Format("wifi strength :{0}", wifiStrength);
  34. }
  35. }

打包注意:Unity中PlayerSetting的Bundle Identifier要與Android工程保持一致,不然沒法調用
打包到真機上,如今可以顯示WIFI強度了spa



相關文章
相關標籤/搜索