1. 程式人生 > >Unity中如何正確使用AndroidJNI

Unity中如何正確使用AndroidJNI

注意:本篇文章不是講述如何在Unity中呼叫android方法的(雖然也可以,但是主要是想呼叫android底層,不是自己寫的jar包)

概念知識或JNI使用可參考:

https://www.cnblogs.com/rocomp/p/4892866.html

通過在unity中呼叫AndroidJNI可以方便的呼叫Android中的系統方法獲取各種屬性配置和方法。

示例1:

unity將檔案寫入到Android/assets資料夾下

    public static string GetAndroidAseet(string filePath)
    {
        string str = "";
        try
        {
#if UNITY_ANDROID && !UNITY_EDITOR
        //取得應用的Activity
        var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
        //從Activity取得AssetManager例項
        var assetManager = activity.Call<AndroidJavaObject>("getAssets");

        //開啟檔案流
        var stream = assetManager.Call<AndroidJavaObject>("open", filePath);
        //獲取檔案長度
        var availableBytes = stream.Call<int>("available");

        //取得InputStream.read的MethodID
        var clsPtr = AndroidJNI.FindClass("java.io.InputStream");
        var METHOD_read = AndroidJNIHelper.GetMethodID(clsPtr, "read", "([B)I");

        //申請一個Java ByteArray物件控制代碼
        var byteArray = AndroidJNI.NewByteArray(availableBytes);
        //呼叫方法
        int readCount = AndroidJNI.CallIntMethod(stream.GetRawObject(), METHOD_read, new[] { new jvalue() { l = byteArray } });
        //從Java ByteArray中得到C# byte陣列
        var bytes = AndroidJNI.FromByteArray(byteArray);
        //刪除Java ByteArray物件控制代碼
        AndroidJNI.DeleteLocalRef(byteArray);
        //關閉檔案流
        stream.Call("close");
        stream.Dispose();
        //返回結果
        str = System.Text.Encoding.Default.GetString(bytes);
#endif
        }
        catch (System.Exception e)
        {
            Debug.LogError(e);
        }

        return str;
    }