【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题
1.有关调用的一些问题:
(1).在C#中直接调用java中的代码,无返回值:
在java中:
public static void setAge(Context context , int level) {}
在C#中:
private static string JAVA_CLASS = "com.wonver.game";
private static string UNITY_CLASS = "com.unity3d.player.UnityPlayer";
public static void setAge(int age)
{
#if UNITY_EDITOR
#elif UNITY_ANDROID
AndroidJavaClass unityClass = new AndroidJavaClass(UNITY_CLASS);
AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
agent.CallStatic("setAge",activity, age);
#elif
}
(2).C#调用java中的代码,有返回值:
在java中:
public static String getAge() {}
在C#中:
public static string getAge()
{
#if UNITY_EDITOR
return null;
#elif UNITY_ANDROID
AndroidJavaObject agent= new AndroidJavaObject(JAVA_CLASS);
return agent.CallStatic<string>("getAge");
#endif
}
(3).java中被调用的方法需要传入Map,但是在C#中只有Dictionary
所以需要在C#中调用Java的时候,将Dictionary转成Map,再传给Java中的方法
在java中:
public static void onUpload(String Id, Map<String, String> map) {}
在C#中:
private static string JAVA_CLASS = "com.wenvor.Upload";
private static AndroidJavaObject agent = new AndroidJavaObject(JAVA_CLASS); Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add("name", "wenvor");
dic.Add("age", "");
Upload.onUpload ("", dic); public static void onUpload (string Id, Dictionary<string, string> dictionary)
{
if(eventId == null)
{
return;
}
#if UNITY_EDITOR
#elif UNITY_ANDROID
AndroidJavaObject map = dicToMap(dictionary);
agent.CallStatic("onUpload", Id, map);
#endif
} #if UNITY_EDITOR
#elif UNITY_ANDROID
public static AndroidJavaObject dicToMap(Dictionary<string, string> dictionary)
{
if(dictionary == null)
{
return null;
}
AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
foreach(KeyValuePair<string, string> pair in dictionary)
{
map.Call<string>("put", pair.Key, pair.Value);
}
return map;
}
#endif
2.C#中的Enum类型可以和Int,String类型相关转换
因为Enum类型的基类型是除Char外的任何整型,所以枚举类型的值是整型值。
3.Android的主线程和Unity引擎的初始化线程不在同一个线程,因此无法知晓什么时候Unity引擎初始化结束。
所以在做SDK的拓展层时候,不要针对SDK里面的OnCreate()方法里面的java代码进行封装,因为可能此时Unity引擎还没有初始化完,即使去调用拓展层的C#接口,
也会有一定的几率调不到。
void OnApplicationPause(bool pauseStatus)
{
#if UNITY_EDITOR
#elif UNITY_ANDROID
if(pauseStatus)
{
//TODO
//Activity的onPause()方法
}
else
{
//TODO
//Activity的onResume()方法
}
#endif
}
5.
在DCAgent.cs中:
public static void attachCurrentThread()
{
AndroidJNI.AttachCurrentThread();
} public static void detachCurrentThread()
{
AndroidJNI.DetachCurrentThread();
}
6.关于Unity的全局管理类:
https://segmentfault.com/a/1190000000645262
public class MyClass : MonoBehaviour { static MyClass _instance; static public MyClass Instance
{
get
{
if (_instance == null)
{
// 尝试寻找该类的实例。此处不能用GameObject.Find,因为MonoBehaviour继承自Component。
_instance = Object.FindObjectOfType(typeof(MyClass)) as MyClass; if (_instance == null) // 如果没有找到
{
GameObject go = new GameObject("_MyClass"); // 创建一个新的GameObject
DontDestroyOnLoad(go); // 防止被销毁
_instance = go.AddComponent<MyClass>(); // 将实例挂载到GameObject上
}
}
return _instance;
}
}
}
7.Android其实也可以调用Unity中的方法,具体实现就是通过UnityPlayer.UnitySendMessage()来实现的。
但是这个方法仅仅提供调用,不提供返回值,是一个Void类型的方法 。
【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题的更多相关文章
- WebView中Js与Android本地函数的相互调用
介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Andr ...
- 在WebView中如何让JS与Java安全地互相调用
在现在安卓应用原生开发中,为了追求开发的效率以及移植的便利性,使用WebView作为业务内容展示与交互的主要载体是个不错的折中方案.那么在这种Hybrid(混合式) App中,难免就会遇到页面JS需要 ...
- 【IOS】ios中NSUserDefault与android中的SharedPreference用法简单对比
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3405308.html 有Android开发经验的朋友对Shar ...
- Android中的HTTP通信
前言:近期在慕课网学习了慕课网课程Android中的HTTP通信,就自己总结了一下,其中参考了不少博文,感谢大家的分享. 文章内容包括:1.HTTP简介2.HTTP/1.0和HTTP/1.1之间的区别 ...
- Android中WebView的JavaScript代码和本地代码交互的三种方式
一.Android中WebView的漏洞分析最近在开发过程中遇到一个问题,就是WebView使用的时候,还是需要解决之前系统(4.2之前)导致的一个漏洞,虽然现在这个系统版本用户很少了,但是也不能忽视 ...
- android中使用setVideoURI()播放视频
最近在做一个demo,要求播放视频,记录一下.使用的是VideoView控件,如果播放网络视频的话,视频应该是渐进流式的,格式嘛,大家应该都知道,一般是H.263或者H.264格式的扩展名为3gp或者 ...
- Android 中Dialog的使用
本文是参考ProAndroid的第10章Working with Dialogs的内容,在合适的地方添加了作者自己的一些见解最终成文. Android 中的对话框是一个展示在当前窗口上的小一号的窗口, ...
- 在android中读写文件
在android中读写文件 android中只有一个盘,正斜杠/代表根目录. 我们常见的SDK的位置为:/mnt/sdcard 两种最常见的数据存储方式: 一.内存 二.本地 1.手机内部存储 2.外 ...
- Android中Intent传值与Bundle传值的区别详解
Android中Intent传值与Bundle传值的区别详解 举个例子我现在要从A界面跳转到B界面或者C界面 这样的话 我就需要写2个Intent如果你还要涉及的传值的话 你的Intent就要写两 ...
随机推荐
- codewars-random(2)
找出数组中的间谍 思路一:遍历一遍数组,开始前将flag设置为0:将count设为0:每当出现一个奇数(注意负数)count加1,当count大于等于2时将flag至为1: 再遍历一遍数组,如果fla ...
- 转载一篇nm命令使用的文章,虽然没用用这个方法解决但是文章很好
http://blog.csdn.net/acs713/article/details/13505931
- java自带的监控工具VisualVM(二)远程监控
ps:尝试了网上的几个网友提供的方法,始终不得其法,汇总后,终于尝试成功!将一些需要注意的细节也记录下来以后备用! 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目 ...
- 关于spring autowrie的5种方式
spring自动注入有5中方式,分别是: byName:根据自动注入类中的对象名字,会到配置文件中找相关id或者name的bean,如果找不到则不会匹配,如果找到多个bean,则会报错. byType ...
- Jenkins配置和使用
之前整理了Jenkins的下载和安装过程,有需要的可以参考我的博客,地址: http://www.cnblogs.com/luchangyou/p/5981884.html 接下来整理一下Jenk ...
- Linux、GUN/Linux、GUN、GPL以及各个发行版本详细介绍
学习Linux很久了,却对GUN,Linux,Linux发行版等无所了解,是不是觉得很对不起自己啊.呵呵,所以我就在网上找了些资料,总结在一起,还算是比较能说明问题的. 什么是Linux? 也许很多人 ...
- PyCharm基本使用
调节PyCharm的背景颜色 File>Settings>Appearance&Behavior>Appearance 在PyCharm中切换Python解释器版本 File ...
- <蛇形填数>--算法竞赛 入门经典(第2版)- 3.1 数组 程序3-3 蛇形填数
蛇形填数: 在n×n方阵里填入1,2,....,n×n,要求填成蛇形.例如,n = 4 时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 ...
- 窗口信息获取器 Spy4Win v0.20b 中文绿色版
软件名称:窗口信息获取器 Spy4Win v0.20b 中文绿色版软件类别:国产软件运行环境:Windows XP软件语言:简体中文授权方式:免费版软件大小:1.67 MB软件等级:整理时间:2012 ...
- win8.1和centos6.5 双系统启动问题
笔记本系统为centos 6.5,由grub引导启动,安装了win 8.1后,开机直接进入win 8.1,没有出现centos6.5 引导项,解决办法: 一.开机按ESC键进入启动顺序菜单,选择cen ...