需求:

  Unity3D 一般用于做游戏 而且是跨平台的。原本设计是Android 应用端A(原生开发)进行一些业务处理,最后由A 打开Android 应用端B(Unity3D 游戏开发)进行游戏操作。

 

  这样导致的问题: 

  1、A应用打开B应用 , 数据之间的传递不方便

  2、正常关闭,异常关闭的交互及技术上处理麻烦

  3、版本迭代,需要分开考虑

  4、体验差

  5. ......................

  最终要合并成一个Android应用 , 提高用户体验。 实现思路即 Android工程继承(引入)Unity3D项目(依赖的Android项目 生成一个类库)。

  

  下面开始详细步骤:

  一、Unity3D 工程师 将 项目生成一个类库

    这个不多说,让Unity3D 工程师去做 ,我们只需要这个类库就行

  

     二、Android工程导入类库

    

    

    注:三个都要选中

        

      导入成功之后 ,会有一些错误,要进行修改

    

 三、修改

  (1)、找到类库目录下的build.gradle文件

       将第一行: apply plugin: 'com.android.application'  改为: apply plugin: 'com.android.library'

       将 compileSdkVersion 和 buildToolsVersion 改为和 app目录的下build.gradle 一致

      将defaultConfig{}下的 applicationId 一行删除

Sync Now...

      最终如下:

      

    

 (2)、找到类库目录下的AndroidManifest.xml 文件

     删除application 下的几条属性

    android:debuggable="false"

    android:label=""

    android:theme=""

    android:icon="@mipmap/ic_launcher"

    

    找到主入口Activity 即有 <intent-filter></intent-filter> 的  ,添加一条属性:android:process="e.unity3d",这是让Unity3D的主Activity退出的时候 可以回到Android部分,否则会有异常问题

     然后删除<intent-filter>内部的所有部分 , 这一部分是标注该Activity作为主入口 并且 在手机桌面上显示的,去掉了,不在桌面显示,因为Android部分调用这个进入Unity3D部分,所以默认具有主入口的功能。

    效果如下:

  <application android:allowBackup="true"
android:name="com.xxxxx.SensorS.XApplication"
android:supportsRtl="true"
android:isGame="true">
<activity
android:configChanges="orientation|keyboardHidden|screenSize"
android:name="com.xxxxx.SensorS.MainActivity"
android:process="e.unity3d"
android:screenOrientation="landscape">
</activity>
  
  //... 注意
  // 打开MainActivity界面是在一个新的进程中的, 见参数android:process="e.unity3d"
  // 如果其他的服务 或 activity 界面 需要在同一个进程 也需要添加 android:process="e.unity3d"
  </application>

    

   (3)、依赖该类库

      

       选择类库依赖

      

   

  (4)、Android部分调打开Unity3D主Activity , 即打开类库中的某个Activity

Intent intent = new Intent();
// unity3d部分的主activity
intent.setClass(TaskListActivity.this,MainActivity.class);
startActivity(intent);

  

  另:可能出现的错误

  1、你的硬件不支持! 

  

  这个出现的几率比较大,首先看一下unity3d类库的文件目录 , 只有armeabi-v7a 和 x86 两个文件夹

  

   所以我们要解决的就是 查看一下app目录下的 和 所有类库下的 libs文件夹或者jniLibs文件夹下 也只能有这两个文件夹 , 多的需要删除

   还要注意:

   如果你的app目录或者module目录下的build.gradle文件夹中有如下代码: 

   ndk {
//选择要添加的对应cpu类型的.so库。
abiFilters 'armeabi-v7a' ,'x86'
}

   记得也必须只能有这两个,多的也要删除。

   只要保持一致,这个问题就解决了。

  

  2、jar包冲突的问题,这个属于常见问题,类库和app中保留一个就行,不多说了。

 

  3、BuildConfig.class 文件冲突

Error:Execution failed for task ':ipark2:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/xxxxx/xxxxx/xxxx/BuildConfig.class

   这个就说你的  com/xxxxx/xxxxx/xxxx/ 目录下的BuildConfig.class 文件冲突了 。 一般是在类库中,jar包下有这么一个文件,而原来项目中是没有的,是生成类库的时候系统给生成的。

     解决方法就是 把该文件从 jar包中删除。

     举例:

   1、现在有一个jar包 

   2、打开该文件所在的目录 , 按Shift + 鼠标右键 选择 ‘从此处打开命令窗口’

      输入命令: jar xf SensorS.jar    注:SensorS 即你的jar包的名字

     

      执行命令之后 会发现目录下多了一个jar包解压后的文件,在该文件夹下按目录找到BuildConfig.class 文件, 删除

    3、重新把处理后的文件夹压缩成jar包

    jar cvf SensorSSS.jar com    注:SensorSSS 即重新生成的jar包的名字  , com即 要被压缩成jar包的文件夹(即原先jar包解压缩出来的文件并删除BuildConfig.class文件)

     

     最后将处理后的jar包替换原来的即可

Android项目实战(三十九):Android集成Unity3D项目(图文详解)的更多相关文章

  1. Java并发编程原理与实战三十九:JDK8新增锁StampedLock详解

    1.StampedLock是做什么的? ----->它是ReentrantReadWriteLock 的增强版,是为了解决ReentrantReadWriteLock的一些不足.   2.Ree ...

  2. Spring Boot教程(三十九)使用MyBatis注解配置详解(2)

    增删改查 MyBatis针对不同的数据库操作分别提供了不同的注解来进行配置,在之前的示例中演示了@Insert,下面针对User表做一组最基本的增删改查作为示例: public interface U ...

  3. “全栈2019”Java第五十九章:抽象类与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. ElasticSearch实战系列八: Filebeat快速入门和使用---图文详解

    前言 本文主要介绍的是ELK日志系统中的Filebeat快速入门教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是 ...

  5. Android项目实战(十九):Android Studio 优秀插件: Parcelable Code Generator

    Android Studio 优秀插件系列: Android Studio 优秀插件(一):GsonFormat Android Studio 优秀插件(二): Parcelable Code Gen ...

  6. Android笔记(三十九) Android中的数据存储——SQLite(一) create

    SQLite是内置于Android的一款轻量级关系型数据库,她运算速度快,占用资源少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用. SQLite不仅支持标准的SQL语法,还遵循数据库 ...

  7. Android笔记(三十) Android中线程之间的通信(二)Handler消息传递机制

    什么是Handler 之前说过了,Android不允许主线程(MainThread)外的线程(WorkerThread)去修改UI组件,但是又不能把所有的更新UI的操作都放在主线程中去(会造成ANR) ...

  8. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十九之铭文升级版

    铭文一级:(没有内容) 铭文二级: 创建Spring boot项目: 看官网,Quick Start下面有两个依赖,必须得使用 但是如果用IDEA构建Spring boot,则会自动添加 New Pr ...

  9. 潭州课堂25班:Ph201805201 django 项目 第三十九课 后台 文章发布,图片上传到 FastDFS后端实现 七牛云讲解(课堂笔记)

    文章发布: # 1,从前台获取参数# 2,校验参数# 3,把数据保存到数据库# 4,返回执行结果到前台,(创建成功或失败) 自定义 froms.py 校验参数 上传图片到七牛云 注册 https:// ...

  10. vue2.0项目实战(4)生命周期和钩子函数详解

    最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...

随机推荐

  1. 利用 WSL 在 Windows下打造高效的 Linux 开发环境

    WSL-Windows Subsystem for Linux 介绍 The Windows Subsystem for Linux lets developers run Linux environ ...

  2. ByteArrayInputStream&ByteArrayOutputStream源码分析

    #ByteArrayInputStream 源码 ``` public synchronized int read(byte b[], int off, int len) { if (b == nul ...

  3. Office隐藏17年的漏洞CVE_2017_11882测试记录

    Office隐藏17年的漏洞CVE_2017_11882测试记录 创建时间: 2017/11/25 0:18 作者: CN_Simo 标签: Office漏洞 参考文章1:https://www.cn ...

  4. 智能合约开发环境搭建及Hello World合约

    如果你对于以太坊智能合约开发还没有概念(本文会假设你已经知道这些概念),建议先阅读入门篇. 就先学习任何编程语言一样,入门的第一个程序都是Hello World.今天我们来一步一步从搭建以太坊智能合约 ...

  5. YOLO 算法框架的使用一(初级)

    YOLO官方框架使用C写的,性能杠杠的,YOLO算法,我就不做过多介绍了.先简单介绍一下这个框架如何使用.这里默认是yolo2,yolo1接近过时.环境 推荐ubuntu 或者centos YOLO是 ...

  6. 问题(一)---线程池,锁、堆栈和Hashmap相关

    一.线程池: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...

  7. C++ UTF8和GB2312相互转换

    #include <Windows.h> #include <string> using std::string; void UTF8_to_GB2312(const char ...

  8. 微信小程序与Java后台的通信

    一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...

  9. MYSQL无法使用索引的场景

    设计优化–无法使用索引的场景 •通过索引扫描的记录数超过30%,变成全表扫描 •联合索引中,第一个索引列使用范围查询--只能用到部分索引 •联合索引中,第一个查询条件不是最左索引列 •模糊查询条件列最 ...

  10. php intval()和floatval()

    intval -- 获取变量的整数值 floatval -- 获取变量的浮点值 <?php $a = 26; $b = 4; $a/=$b; echo intval($a);//6 echo f ...