1.有关调用的一些问题:
(1).在C#中直接调用java中的代码,无返回值:
在java中:
1 public static void setAge(Context context , int level) {}
在C#中:
1 private static string JAVA_CLASS = "com.wonver.game"; 2 private static string UNITY_CLASS = "com.unity3d.player.UnityPlayer"; 3 public static void setAge(int age) 4 { 5 #if UNITY_EDITOR 6 #elif UNITY_ANDROID 7 AndroidJavaClass unityClass = new AndroidJavaClass(UNITY_CLASS); 8 AndroidJavaObject activity = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); 9 agent.CallStatic("setAge",activity, age); 10 #elif 11 }
(2).C#调用java中的代码,有返回值:
在java中:
1 public static String getAge() {}
在C#中:
1 public static string getAge() 2 { 3 #if UNITY_EDITOR 4 return null; 5 #elif UNITY_ANDROID 6 AndroidJavaObject agent= new AndroidJavaObject(JAVA_CLASS); 7 return agent.CallStatic<string>("getAge"); 8 #endif 9 }
(3).java中被调用的方法需要传入Map,但是在C#中只有Dictionary
所以需要在C#中调用Java的时候,将Dictionary转成Map,再传给Java中的方法
在java中:
1 public static void onUpload(String Id, Map<String, String> map) {}
在C#中:
1 private static string JAVA_CLASS = "com.wenvor.Upload"; 2 private static AndroidJavaObject agent = new AndroidJavaObject(JAVA_CLASS); 3 4 Dictionary<string, string> dic = new Dictionary<string, string>(); 5 dic.Add("name", "wenvor"); 6 dic.Add("age", "27"); 7 Upload.onUpload ("100", dic); 8 9 10 public static void onUpload (string Id, Dictionary<string, string> dictionary) 11 { 12 if(eventId == null) 13 { 14 return; 15 } 16 #if UNITY_EDITOR 17 #elif UNITY_ANDROID 18 AndroidJavaObject map = dicToMap(dictionary); 19 agent.CallStatic("onUpload", Id, map); 20 #endif 21 } 22 23 24 #if UNITY_EDITOR 25 #elif UNITY_ANDROID 26 public static AndroidJavaObject dicToMap(Dictionary<string, string> dictionary) 27 { 28 if(dictionary == null) 29 { 30 return null; 31 } 32 AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap"); 33 foreach(KeyValuePair<string, string> pair in dictionary) 34 { 35 map.Call<string>("put", pair.Key, pair.Value); 36 } 37 return map; 38 } 39 #endif
2.C#中的Enum类型可以和Int,String类型相关转换
因为Enum类型的基类型是除Char外的任何整型,所以枚举类型的值是整型值。
3.Android的主线程和Unity引擎的初始化线程不在同一个线程,因此无法知晓什么时候Unity引擎初始化结束。
所以在做SDK的拓展层时候,不要针对SDK里面的OnCreate()方法里面的java代码进行封装,因为可能此时Unity引擎还没有初始化完,即使去调用拓展层的C#接口,
也会有一定的几率调不到。
1 void OnApplicationPause(bool pauseStatus) 2 { 3 #if UNITY_EDITOR 4 #elif UNITY_ANDROID 5 if(pauseStatus) 6 { 7 //TODO 8 //Activity的onPause()方法 9 } 10 else 11 { 12 //TODO 13 //Activity的onResume()方法 14 } 15 #endif 16 }
5.
在DCAgent.cs中:
1 public static void attachCurrentThread() 2 { 3 AndroidJNI.AttachCurrentThread(); 4 } 5 6 public static void detachCurrentThread() 7 { 8 AndroidJNI.DetachCurrentThread(); 9 }
6.关于Unity的全局管理类:
https://segmentfault.com/a/1190000000645262
1 public class MyClass : MonoBehaviour { 2 3 static MyClass _instance; 4 5 static public MyClass Instance 6 { 7 get 8 { 9 if (_instance == null) 10 { 11 // 尝试寻找该类的实例。此处不能用GameObject.Find,因为MonoBehaviour继承自Component。 12 _instance = Object.FindObjectOfType(typeof(MyClass)) as MyClass; 13 14 if (_instance == null) // 如果没有找到 15 { 16 GameObject go = new GameObject("_MyClass"); // 创建一个新的GameObject 17 DontDestroyOnLoad(go); // 防止被销毁 18 _instance = go.AddComponent<MyClass>(); // 将实例挂载到GameObject上 19 } 20 } 21 return _instance; 22 } 23 } 24 }
7.Android其实也可以调用Unity中的方法,具体实现就是通过UnityPlayer.UnitySendMessage()来实现的。
但是这个方法仅仅提供调用,不提供返回值,是一个Void类型的方法 。
【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题
原文:http://www.cnblogs.com/wufeng0927/p/5178216.html