【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類型的方法 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM