ちょび日記

明日は明日の風が吹く

2016-10-20

StreamingAssetsのデータをAndroidJNI経由で取得する


昨日はNDK側での処理でしたが今日はAndroidJNIを使った版、まーやってることは一緒ですね。

private byte[] readFromAssetManager(string filePath)
{
    var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
    var assetManager = activity.Call<AndroidJavaObject>("getAssets");
    var stream = assetManager.Call<AndroidJavaObject>("open", filePath);
    var availableBytes = stream.Call<int>("available");
    var clsPtr = AndroidJNI.FindClass("java/io/InputStream");
    var METHOD_read = AndroidJNIHelper.GetMethodID(clsPtr, "read", "([B)I");
    var byteArray = AndroidJNI.NewByteArray(availableBytes);
    var bytes = AndroidJNI.FromByteArray(byteArray);
    AndroidJNI.DeleteLocalRef(byteArray);
    stream.Call("close");
    stream.Dispose();

    return bytes;
}

注意点としてはAndroidJNI.FindClassが昔の端末ではjava.io.InputStreamとドット区切りで指定しなければいけませんが 最近のではスラッシュ区切りになっている、というところぐらいでしょうか。

参照元: https://segmentfault.com/a/1190000004849884

stackoverflowの中国版てきなsegmentfaultなんてあるんですね。 因みに、中国語は翻訳で英語に変えるとわりとすんなり読めたりします。



Copyright© 2016, chobie All rights reserved.