unity快速读取streamassets/目录下的assetbundle文件

发表于2016-09-28
评论0 6.9k浏览

主要思路是,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

//////////

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论