2015-11-03 76 views
0

我正在爲unity 3d寫一個android插件,我的問題是初始化我需要將applicationContext傳遞給一個方法。 所以我MyPlugin.cs就像下面從Unity獲取applicationContext 3d

using UnityEngine; 
using System.Collections; 

public class MyPlugin : MonoBehaviour { 

void Awake() { 
    Debug.Log ("awake"); 
    Initialize(); 
} 

public static void Initialize() 
{ 
    AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
    AndroidJavaObject activity = playerClass.GetStatic<AndroidJavaObject>("currentActivity"); 
    AndroidJavaClass pluginClass = new AndroidJavaClass("com.mycompany.product.UnityPlugin"); 
    pluginClass.CallStatic("initialize", new object[1] {activity}); 
} 
} 

和Android的UnityPlugin.java類我有

public class UnityPlugin extends Plugin { 
    static public void initialize (Activity unityActivity){ 
     try { 
      MyApp.initialize(unityActivity.getApplicationContext()); 
     } catch (NullPointerException e){ 
      Log.d("unity", "null pointer exception"); 
     } 
    } 
} 

,我得到NullPointerException所有的時間。從統一活動中獲得AppilcationContext的正確方法是什麼?

回答

3

首先,檢查是否插件類是空

if(pluginClass == null) Debug.Log("plugin class is null"); 

如果這是確保你正在創建適當字符串參數新AndroidJavaClass。

接下來,我不確定爲什麼要傳遞一個Activity的數組而不是傳遞Unity的上下文。嘗試是這樣的:

AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); 
AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); 
AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext"); 
pluginClass.CallStatic("initialize", context); 

您還需要修改插件側方式如下:

public class UnityPlugin extends Plugin { 
    static public void initialize (Context unityContext){ 
     try { 
      MyApp.initialize(unityContext); 
     } catch (NullPointerException e){ 
      Log.d("UnityPlugin", "Null PTR Exception"); 
      e.printStackTrace(); 
     } 
    } 
} 
+0

真棒!爲我工作得很好 –