unity快速读取streamassets/目录下的assetbundle文件
主要思路是,android_ndk 读取asset目录下的api,这样做的好处,1,避免www加载慢,2,避免createfromefile不能读取未加密的assetbundle包,主要代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,"UnityNative",__VA_ARGS__) // 定义LOGD类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,"UnityNative",__VA_ARGS__)
extern "C" {
static AAssetManager* mgr=NULL;
//java+pakagename+clasename
void Java_com_a_b_c_GameaActivity_initreadFromAssets(JNIEnv* env,jclass tis,jobject assetManager)
{
LOGW("init_DSActivity_initreadFromAssets");
mgr = AAssetManager_fromJava(env, assetManager);
if(mgr==NULL)
{
LOGW(" %s","AAssetManager==NULL");
return ;
}
}
AAsset* asset = NULL;
size_t mSize;
void getAssetData(unsigned char * data)
{
if(asset == NULL)
{
LOGW("ast is null====");
return;
}
//memset(data,0,mSize); 暂留,好像没什么用C#默认就是0不需要设置了
int ret = AAsset_read(asset, data, mSize);
if(ret <= 0)
{
delete [] data;
data = NULL;
}
AAsset_close(asset);
}
//C# used function
int getNativeStreamFromAssets(char* fileName)
{
if(mgr==NULL)
{
LOGW("mgr is null ");
return 0;
}
asset = AAssetManager_open(mgr, fileName,AASSET_MODE_UNKNOWN);
if(asset==NULL)
{
LOGW("asset is null ");
return 0;
}
mSize = AAsset_getLength(asset);
return mSize;
}
//system auto use
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved)
{
LOGW("JNI_OnLoad");
JNIEnv* env = NULL;
#ifdef __cplusplus
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
#else
if ((*jvm)->GetEnv(jvm,(void**) &env, JNI_VERSION_1_4) != JNI_OK)
#endif
{
return -1;
}
return JNI_VERSION_1_4;
}
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *jvm, void *reserved)
{
LOGW("JNI_OnUnload");
return;
}
}
C#接收
//////////////
#if UNITY_ANDROID
[DllImport("dsnative")]
private static extern int getNativeStreamFromAssets(string filename);
[DllImport("dsnative")]
private static extern void getAssetData(byte[] data);
int retCode = getNativeStreamFromAssets(path);
if(retCode == 0)
{
Debug.LogError("load error asset="+path);
continue;
}
byte[] _newbyte = new byte[retCode];
getAssetData(_newbyte);
#endif
//////////
如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引