zoukankan      html  css  js  c++  java
  • Unity通过Jar包调用Android

    Unity通过Jar包调用Android

    我们会需要面对下面几个问题,我们一个一个来解决:

    1. 怎样在Android Studio中打Jar包
    2. 怎样打一个Unity使用的Jar包
    3. 怎样在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包,具体代码如下:

    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包

    怎样打一个Unity使用的Jar包

    使用Android Studio新建一个空工程,首先我们需要将接口class.jar引入到工程libs文件夹下.接口包所在地C:Program FilesUnity5.2.3EditorDataPlaybackEnginesandroidplayerVariationsmonoReleaseClassesclass.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.xml

    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包.
    注意:在这有一个坑,需要将buildintermediatesclasses eleasecom你的包名你的工程名 下面的R开头的class文件全部删掉,不然在Unity中使用打包时会报错

    怎样在Unity工程中使用这个Jar包

    开始创建Unity工程.如图所示,Plugins->Android,将AndroidMinifest.xml放入这一层文件夹并建立res文件夹(下面放打包时需要用到的资源,如APP的图标等)和bin文件夹(放刚刚生成的.jar包)
    注意:Jar包的名字可以随便修改,但是jar包里面必须是com你的包名你的工程名你需要的class,否则运行程序后提示找不到类文件

    在Unity中新建一个Test.cs
    Test.cs

    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强度了





  • 相关阅读:
    数据库
    Activity组件
    view,视图组件
    360导航板式
    service音乐播放
    service
    音乐播放器组件
    获取时间字符串
    JDK服务器存储
    数据库_黑名单练习_完善服务广播
  • 原文地址:https://www.cnblogs.com/BobbyWeaver/p/5148883.html
Copyright © 2011-2022 走看看