【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题

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#接口,

也会有一定的几率调不到。

 
4.
 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类型的方法 。

 

posted @ 2016-02-02 19:53  TwoFish  阅读(13390)  评论(1编辑  收藏  举报