zoukankan      html  css  js  c++  java
  • Android Studio如何导出可供Unity使用的aar插件详解 转

    Android Studio如何导出可供Unity使用的aar插件详解

     

    前言

      项目之前使用Eclipse导出的jar文件来做与Android交互,最近因为工作需要需使用Android Studio的aar文件,网上参考了部分文章,也结合自己的理解重新整理一下具体的方法,通过写一个测试Demo来表述Android Studio创建aar的过程与及Unity如何使用aar文件,希望对刚好有这个需求的人能起到部分帮助与引导,同时如果文中有误希望也能不吝赐教。

    版本信息

      Unity 5.3.1f1,

      Android Studio 2.2.3

    Android Studio导出可供Unity使用的aar插件

    一、 创建Android Studio工程

      1)第一步,点击File->New->New Project,打开"Create New Project"对话框,选择合适的Application name与Company Domain,保证Package name与Unity项目中的Bundle Idenifier一致
           
      2)第二步,选择Phone and Tablet,并选择合适的Minimum SDK(也可以在创建后的build.gradle中设置)
           
         3)第三步,选择“Empty Activity”
           
         4)第四步,保持默认的Activity Name与Layout Name即可
       5)最后,点击"Finish"创建工程

    二、添加Unity的classes.jar引用

      1)把Unity引擎目录下中的”EditorDataPlaybackEnginesAndroidPlayerVariationsmonoReleaseClassesclasses.jar“文件拷贝至Android Studio工程中的libs目录

      2)右击"Project"视图,打开"Open Module Settings", 添加“classes.jar”依赖

        

    三、编写Android侧代码(修改MainActivity代码)

    复制代码
    import android.os.Bundle;
    import android.widget.Toast;
    import com.unity3d.player.UnityPlayer;
    import com.unity3d.player.UnityPlayerActivity;
     
    public class MainActivity extends UnityPlayerActivity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
     
        // 显示Toast消息
        public void ShowToast(final String message){
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
                }
            });
        }
     
        // 返回一个字符串(静态方法)
        public static String GetInformation()
        {
            return "This is a Plugin's content!";
        }
    }
    复制代码

     四、修改build.gradle,设置工程导出为aar

      1)apply plugin: 'com.android.application'  修改为     apply plugin: 'com.android.library'

      2)删除 applicationId "com.zcode.unityandroidplugindemo"

      3)修改后的build.gradle为

    复制代码
    apply plugin: 'com.android.library'
     
    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.1"
        defaultConfig {
            minSdkVersion 18
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
     
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:24.1.1'
        testCompile 'junit:junit:4.12'
        compile files('libs/classes.jar')
    }
    复制代码

    五、修改AndroidManifest.xml

         1)修改样式
              我们需要在 AndroidManifest 中的 application 结点修改应用的主样式为系统样式,因为导出的 AAR 文件将不带自定义的样式,在我们的 Unity 项目中生成最终 apk 的时候会出现样式找不到的错误。
              
              同时需要删除resValues目录下的styles.xml文件
     
         2)在主 activity 结点下添加<meta-data>信息,否则在 Unity 导出 APK 时会报找不到manifest 文件的错误信息
              

    六、导出供Unity使用的*.aar文件

         1)点击“Build -> Build APK”,生成aar文件

         2)由于Unity在打包APK时会自动包含自身的classes.jar,所以需使用压缩软件打开aar文件删除libs目录下的classes.jar文件

    Unity导入插件,并调用

    一、创建Unity工程

    二、导入插件到Unity工程中

         1)新建Plugins目录与Android子目录
         2)拷贝aar文件与AndroidManifest.xml文件至Android目录下
      

    三、编写测试代码

         1)新建一个“Call.cs”的脚本文件

         2)在“Call.cs”脚本中编写调用Android侧代码

    复制代码
    using UnityEngine;
    using System.Collections;
     
    public class Call : MonoBehaviour {
        string information_ = null;
     
        void OnGUI() {
            //调用显示一个文本为“Hello World!”的Toest
            if(GUI.Button(new Rect(0, 0, 200, 20), "Show Toest - Hello World!")) {
                //Unity侧调用Android侧代码
                using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                    using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) {
                        //调用成员方法
                        jo.Call("ShowToast", "Hello World!");
                    }
                }
            }
     
            //获得插件侧的返回字符串
            if (GUI.Button(new Rect(0, 40, 200, 20), "Get Plugin's Information")) {
                //Unity侧调用Android侧代码
                using (AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
                    using (AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity")) {
                        //调用静态方法
                        information_ = jo.CallStatic<string>("GetInformation");
                    }
                }
            }
            //显示返回的字符串
            GUI.Label(new Rect(220, 40, Screen.width - 220, 20), information_);
        }
    }
    复制代码

    四、导出APK

         1)设置Bundle Identifier(保持与插件PackageName一致)
         2)设置合适的Minimum API Level(保持与插件)

    五、测试

    Demo地址

      http://pan.baidu.com/s/1dFxc7JF

    结尾

      Android侧调用Unity侧的方式在此就不多做赘述,网上相关的文章也很多。

      Android插件工程中使用第三方的aar库中遇到的Bug解决方案

        1.需手动拷贝至Unity项目Plugin/Android目录下,不然会找不到该库引起NoClassDefFoundError的错误,导致项目真机引起宕机(PS:Unity打包APk时并不会检查Android插件中是否完整包含其它aar库)

        2.确定所有的aar库中的android:minSdkVerion与android:targetSdkVersion一致

  • 相关阅读:
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    2020系统综合实践 第1次实践作业
    WireShark组 2019 SDN大作业
    2019 SDN阅读作业
    第07组 Beta版本演示
    OO第四单元总结
    OO第三单元总结
    OO第二单元总结
    OO第一单元总结
  • 原文地址:https://www.cnblogs.com/AlanCheng/p/6945452.html
Copyright © 2011-2022 走看看