Skip to content

Instantly share code, notes, and snippets.

@luxuia
Created November 15, 2018 08:39
Show Gist options
  • Save luxuia/a21d0b42633c009d04e17039218617cd to your computer and use it in GitHub Desktop.
Save luxuia/a21d0b42633c009d04e17039218617cd to your computer and use it in GitHub Desktop.
sometime need read apk file in unity, with out know file path
public static string ReadFileInAPK(string filepath) {
//取得应用的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();
//返回结果
return System.Text.Encoding.Default.GetString(bytes);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment