Unity中如何正確使用AndroidJNI
阿新 • • 發佈:2018-12-16
注意:本篇文章不是講述如何在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; }