【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就要写两 ...
随机推荐
- ACM第二题 生理周期
人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易 ...
- 【CodeVS】1293
输入输出样例 思路:看到题目我萌第一眼想到的肯定是求联通快对吧,但是这个联通快有点奇特,因为 这样他也算是一个联通快.解决此题其实有三种解法:1)宽搜(这个符合基本法):2)并查集:3)灌水法 但是蒟 ...
- JS 常用功能收集
JS 常用效果收集 1. 回到顶部>> 爱词霸
- JavaScript 中的this指向问题
全局执行 首先,我们在全局环境中看看它的 this 是什么: 浏览器: console.log(this); // Window {speechSynthesis: S ...
- Ubuntu16.04删除客人会话
1.按下 Ctrl+Alt+T - 打开终端 2.输入以下指令: sudo gedit /etc/lightdm/lightdm.conf 3.源代码之后添加如下代码,然后保存.关闭,重启电脑即可. ...
- ACM北大学习
在两周的学习下,对ACM竞赛有了更深入地了解.学习到了很多知识,见识到了很多高手,目光放得更长远了.最后的比赛,在100多个队伍中,获得第十八的名次,也不负我的学习.
- 快速掌握LODOP打印使用方法
用运之前简单介绍几个东西. install_lodop32.exe与install_lodop64.exe这两个是2个网页打印控件,网页打印必须安装这个控件在客户端,分为32和64位安装控件.(如果自 ...
- jQuery中操作Ajax方法小结
有时候,越深入去了解一个点,越发觉得自己无知,而之前当自己晓得一两个片面的点还洋洋自得,殊不知,这是多么讽刺 jQery对Ajax操作进行了封装,常见的 ajax()属于最底层的方法,使用频率很高的 ...
- Jquery 2个数组,去除重复的项目
长数组(Positions_Check) 短数组(PositionTitlesParent_Check) for (var i = 0; i < PositionTitlesParent_Che ...
- Web流量劫持
BadTunnel实战之远程劫持任意内网主机流量 http://www.freebuf.com/articles/web/109345.html http://blog.csdn.net/ts__cf ...