1. 程式人生 > >Android Stuido匯出AAR 給Unity3D呼叫注意事項

Android Stuido匯出AAR 給Unity3D呼叫注意事項

1. 匯出 AAR過程需要注意,依賴的檔案並沒有打進去,所以要收到拷入到 Unity專案中,如下圖中的 support包,是我專案中要用到的:


2.刪除aar包中重複的 libs下的 jar檔案和 jni下的  .so檔案,否則呼叫的時候會報錯。


3. Manifest檔案也要拷到 Unity專案中的 Plugin/Android下,因為會有一些 許可權的宣告。 例如:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission 
android:name="android.permission.READ_EXTERNAL_STORAGE"/>

4. Unity中執行的時候,一定注意 這個Bundle Identifer 包名的指定,要和你 AAR中 Manifest一致,否則執行中 啟動某個 Activity,就
會報找不到Activity,因為你是在Manifest中對其進行的宣告。


5. C# 呼叫 Android程式碼的例項 ,包括 不帶引數和 帶引數的幾種情況都有了:

 using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.xxx.xxx.Manager"))
            
            {

                AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");  
			    AndroidJavaObject activity = jc.GetStatic<AndroidJavaObject>("currentActivity");

                Debug.Log("-----------com.xxx.androidplugin.Recorde------" + pluginClass);
                if (pluginClass != null)
                {
                   instance = pluginClass.CallStatic<AndroidJavaObject>("getInstance");

                   new AndroidJavaObject("com/xxx/xxx/Manager").Call("stop");

                    int[] mObject = new int[2];
                    mObject[0] = 1111;
                    mObject[1] = 2134;

                    instance.Call("speak", "test ", 21313);
                    instance.Call("sing", mObject);
                    instance.Call("stop");

                    instance.Call("takePhotoByCamera", activity);
                    

                }
            }

6. 當android中方法有返回值的時候,以及引數,型別一定要和C#中的一致,型別一定要和C#中的一致,型別一定要和C#中的一致 long  Long 類似的區別

遇到個坑,浪費半天找不到原因,發現  android中引數寫成了Long,而C#中是 Call<long>,一直報錯 NoSuchMethodError: no non-static method with name。。。。

正確的如下

public class KeyIdManager {

    private static final String TAG = "KeyIdManager";

    private Long mId = -1L;
    private static KeyIdManager mKeyIdManager;

    public static KeyIdManager getInstance() {
        if (mKeyIdManager == null) {
            mKeyIdManager = new KeyIdManager();
        }
        return mKeyIdManager;
    }

    public void setId(long id) {
        mId = id;
        Log.d(TAG, "setId: mId == " + mId);
    }

    public long getKeyId() {
        return mId;
    }
}
C#
AndroidJavaObject instance = new AndroidJavaClass("com.xxx.util.KeyIdManager").CallStatic<AndroidJavaObject>("getInstance");
                    instance.Call("setId", 100L);
                    Debug.Log("--------getKeyId------" + instance.Call<long>("getKeyId"));


參考: