由于Java是Android的官方语言,大量原生调用和库都是基于Java语言的。而Unity3D的开发语言是C#,导致很多原生功能需要借用Jar库。
使用U3D的很多程序员对Java以及Android Studio之类的开发工具并不熟悉,一个很简单的功能也可能要耗费掉许多精力,需要大量学习以帮助熟悉Java和他的开发框架。
自从Unity3D 2018以后,这种烦恼减少了。Unity3D 2018可以直接使用Java(.java)和Kotlin(.kt)源码文件了。只要把.java或者.kt的源代码文件直接放置在Plugins目录下,Android Gradle编译系统会自动编译Jar,无需用户自己做设置。

下图为Gradle编译器自动生成的类似于Android Studio开发功能目录结构

以下提供一个最简单的Android Service框架,可以在自己的Unity3D Android工程中方便使用,扩展Android原生功能。

创建一个最简单的Android Service类

新建一个MainService.java文件,放置于Plugins目录下。Java类的文件命名方式和C#类类似,文件名和类名要一致。

package com.VRFab.VRXPlayer; // 调用服务的package包名前缀,此处包名全程是com.VRFab.VRXPlayer.MainServiceimport android.app.Service;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.ComponentName;
import android.app.ActivityOptions;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.provider.Settings;
import android.graphics.Rect;import com.unity3d.player.UnityPlayer;
import android.widget.Toast;
import android.os.Build;public class MainService extends Service { // 从Service继承后台服务类(另一个类型是Activity实体窗口类)//Log用的TAGprivate static final String TAG = "MainService";protected UnityPlayer mUnityPlayer;// 静态成员public static String message = "";public static Activity activity = null;// 静态函数public static void StartService(Activity act) {activity = act;act.startService(new Intent(act, MainService.class));}public static void Launch(String pkgName) {message = "Launch";Intent LaunchIntent = new Intent();LaunchIntent.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);ComponentName componentName = new ComponentName(pkgName, "com.unity3d.player.UnityPlayerActivity");LaunchIntent.setComponent(componentName);LaunchIntent.setAction("android.intent.action.MAIN");ActivityOptions ao = ActivityOptions.makeBasic();Rect rect = new Rect(0, 0, 200, 100);ActivityOptions bounds = ao.setLaunchBounds(rect);activity.startActivity(LaunchIntent, bounds.toBundle());}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "MainService Created");message = "MainService Created";mUnityPlayer = new UnityPlayer(this.getApplicationContext());}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}// Quit Unity@Override public void onDestroy (){super.onDestroy();}
}

注册Android服务的package

打开\Assets\Plugins\Android\AndroidManifest.xml文件,添加服务注册代码

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal"><application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:isGame="true"><!--activity注册--><activity><!--...--></activity><!--service注册--><service android:name="com.VRFab.VRXPlayer.MainService" android:enabled="true" android:exported="true"><!--android:name和Service的package全名一致--></service></application>
</manifest>

通过C#代码启动Android Service

由于C#不能直接使用Java的类型,Unity3D C#通过AndroidJavaClass和AndroidJavaObject对Java类进行包装,AndroidJavaClass是对Java类类型的引用,AndroidJavaObject是对Java类实例的引用。
通常通过AndroidJavaClass调用静态函数*(CallStatic和CallStatic<>,注意,没有返回值的函数不要用CallStatic<>调用,会报没有匹配函数错误)和静态成员(GetStatic<>/SetStatic<>)*
通过AndroidJavaObject调用成员函数*(Call和Call<>,注意,没有返回值的函数不要用Call<>调用,会报没有匹配函数错误)和属性(Get<>/Set<>)*

实际上AndroidJavaClass和AndroidJavaObject都有Call和CallStatic函数,也都有GetStatic/SetStatic和Get/Set函数,规则上有一定混乱的,最好还是按照字面意思分别用作静态函数调用和成员函数调用

    AndroidJavaClass clsMainService = new AndroidJavaClass("com.VRFab.VRXBle.MainService"); // 创建MainService类型引用AndroidJavaClass clsActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); // 创建UnityPlayer类型引用AndroidJavaObject objActivity = clsActivity.GetStatic<AndroidJavaObject>("currentActivity"); // UnityPlayer类型调用静态成员获得UnityPlayerActivity实例引用,这是Unity3D生成App的主Activity,也是唯一ActivityclsMainService.CallStatic("StartService", objActivity); // 通过MainService类型调用Java静态成员,启动com.VRFab.VRXBle.MainService后台服务,具体启动代码见java代码

之后,我们可以在MainService中添加Java函数和代码,通过Call和CallStatic调用,帮助Unity3D C#实现Android原生功能。
比如我们可以调用MainService.Launch函数帮我们启动apk,通过java代码可以设置更多启动参数

clsMainService.CallStatic("Launch", "com.VRFab.GameApp"); // Launch代码见MainService.java

如果通过C#直接调用启动apk包,则只能通过AndroidJavaClass和AndroidJavaObject调用Java库,实现的代码比较复杂和别扭

  public static XmlRequestResult OpenPackage(string pkgName){XmlRequestResult r = new XmlRequestResult();using (AndroidJavaClass jcPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")){using (AndroidJavaObject joActivity = jcPlayer.GetStatic<AndroidJavaObject>("currentActivity")){try{AndroidJavaObject Intent = new AndroidJavaObject("android.content.Intent");AndroidJavaObject ComponentName = new AndroidJavaObject("android.content.ComponentName", pkgName, "com.unity3d.player.UnityPlayerActivity");Intent.Call<AndroidJavaObject>("setComponent", ComponentName);Intent.Call<AndroidJavaObject>("setAction", "android.intent.action.MAIN");joActivity.Call("startActivity", Intent);r.Code = XmlRequestResult.ExceptionCode.noerror;r.Message = "OK";}catch (System.Exception ex){r.Code = XmlRequestResult.ExceptionCode.unknown_exception;r.Message = "调用程序包失败: " + ex.Message;}}}return r;}

Unity3D Android集成Java源代码相关推荐

  1. java编写安卓程序代码,安卓:从Android的Java源代码code创建UML

    i am looking for a program that can create automatically an Uml from my Java-Android source code. I ...

  2. Android端+java后端+servlet+MySQL的型男塑造平台【前后端源代码+论文+答辩ppt】

    活动地址:毕业季·进击的技术er 目录 前言 第一章 绪论 1.1 背景和意义 1.2 国内外研究现状 1.3 论文研究目标与内容 1.4.减肥瘦身相关概念与计算方式介绍 第二章 需求分析 2.1 平 ...

  3. Android Studio 安卓手机上实现火柴人动画(Java源代码—Python)

    演示 1.activity_main.xml当中设置布局 源代码 <?xml version="1.0" encoding="utf-8"?> &l ...

  4. Android APK反编译得到Java源代码或资源文件

    一.反编译Apk得到Java源代码 首先要下载两个工具:dex2jar和JD-GUI,前者是将apk中的classes.dex转化成Jar文件,而JD-GUI是一个反编译工具,可以直接查看Jar包的源 ...

  5. 使用Android Studio搭建Android集成开发环境

    一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA开发环境,旨 ...

  6. unity3d能和java系统整合吗_Android与Unity3d的整合

    我需要创建一个Android应用程序,它包括部分写在Unity3D中(动画等)一部分在AndroidSDK(我的意思是用java写的实现,清单和资源) 其实这两部分我都有了(至少自认为准备好了 =)) ...

  7. Unity3d Android SDK接入解析(四)通用的Android SDK接入中间件

    一.前言 接入Android SDK正式告一段落,在这段时间里面,依次接入了华为.应用宝.小米.360等等大大小小十来个SDK,也算对Unity接入渠道SDK有了较为全面的理解,对各个渠道的坑也算深有 ...

  8. Android开发开源源代码

    Android经典的开源项目其实非常多,把自己熟悉的一些开源项目整理起来,希望能对Android开发同学们有所帮助 项目篇: 1.Apollo音乐播放器 就一个很好的播放器,但是实现的特别好!!! 地 ...

  9. Android 集成Mob实现手机短信验证码

    项目中集成MOB.com提供的三方短信SDK. 当然这些短信都是免费的.并且可以在您申请的MOB.com后台去查看短信注册用户的相关信息. 这篇文后半部分会提供一个简单的验证短信Demo,有界面,当然 ...

  10. 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

最新文章

  1. mysql在建站起什么作用_数据库操作对比:Sql Server与MYSQL相比有哪些建站优势?...
  2. markdown语法中的空格_Markdown常用语法汇总
  3. RecyclerView ItemTouchHelper
  4. NIO详解(二): BIO 浅谈 同步 异步与阻塞 非阻塞
  5. xpcom java_[Mozilla] JavaXPCOM 的jar 包概述
  6. python对数据进行分类_在Python中对一系列数据进行分类的最佳方法
  7. GridControl动态添加 颜色列
  8. 一个公式来说明加接圈的作用和缺点
  9. 使用UIBinder的GWT自定义按钮
  10. linux下搜狗输入法无法输入中文解决方法
  11. 安装hadoop集群---resourcemanager和NameNode不在同一台机器上
  12. python版:装饰器模式
  13. mysql 5.5 udf_MYSQL5漏洞之udf提权
  14. 从imdb爬取ml-100k的电影封面
  15. 【5分钟 Paper】Continuous Control With Deep Reinforcement Learning
  16. ios控件 UIViewController
  17. applet java_在浏览器中运行java applet
  18. ubuntu2004 安装protoc
  19. 经典逻辑题笔试题和答案
  20. 资源池(从内存池到连接池)

热门文章

  1. #考研笔记#计算机之word问题
  2. K3CLOUD业务系统编码规则设置
  3. 【Jmeter】Jmeter使用教程
  4. curl测试post请求
  5. iTOP4412 uboot移植教程
  6. js获取ie版本号与html设置ie文档模式的方法
  7. K8S终端UI界面--K9S
  8. 探索:区块链视频流媒体平台
  9. 福禄克DSX2-8000——支持铜缆、光纤、OTDR测试的多功能网线测试仪
  10. 华为荣耀盒子显示服务器忙,华为荣耀盒子m321连接后死机了怎么办?教你三大解决方法...