• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

修改Live2d使用C++层加载Asset资源

武飞扬头像
来自星星的欧巴
帮助1

原生官方使用的是java层加载Asset资源,然后通过jni获得java加载好的 char* 数据

  1.  
    char *JniBridgeC::LoadFileAsBytesFromJava(const char *filePath, unsigned int *outSize) {
  2.  
    JNIEnv *env = GetEnv();
  3.  
     
  4.  
    // ファイルロード //文件加载
  5.  
    jbyteArray obj = (jbyteArray) env->CallStaticObjectMethod(g_JniBridgeJavaClass,
  6.  
    g_LoadFileMethodId,
  7.  
    env->NewStringUTF(filePath));
  8.  
    *outSize = static_cast<unsigned int>(env->GetArrayLength(obj));
  9.  
     
  10.  
    char *buffer = new char[*outSize];
  11.  
    env->GetByteArrayRegion(obj, 0, *outSize, reinterpret_cast<jbyte *>(buffer));
  12.  
     
  13.  
    return buffer;
  14.  
    }

我们需要更改在c 中直接加载Asset资源,抛弃java层,提高io效率

  1.  
    char* JniBridgeC::LoadFileAsBytesFromCpp(const char *filePath, unsigned int *outSize) {
  2.  
    JNIEnv *env = GetEnv();
  3.  
     
  4.  
    jobject assetManager = env->CallStaticObjectMethod(g_JniBridgeJavaClass,g_SetAssetManagerId);
  5.  
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
  6.  
    if(mgr==NULL)
  7.  
    {
  8.  
    LOGE(" %s","AAssetManager==NULL");
  9.  
    }
  10.  
    /*获取文件名并打开*/
  11.  
     
  12.  
    AAsset* asset = AAssetManager_open(mgr, filePath,AASSET_MODE_UNKNOWN);
  13.  
    if(asset==NULL)
  14.  
    {
  15.  
    LOGE(" %s","asset==NULL");
  16.  
    }
  17.  
    off_t bufferSize = AAsset_getLength(asset);
  18.  
    unsigned int size = bufferSize;
  19.  
    *outSize = size;
  20.  
    char *buffer=(char *)malloc(bufferSize 1);
  21.  
    buffer[bufferSize]=0;
  22.  
    int numBytesRead = AAsset_read(asset, buffer,bufferSize);
  23.  
    AAsset_close(asset);
  24.  
     
  25.  
    return buffer;
  26.  
    }
学新通

然后在LAppPal.cpp调用这个函数的地方更换掉

  1.  
    csmByte* LAppPal::LoadFileAsBytes(const string filePath, csmSizeInt* outSize)
  2.  
    {
  3.  
    //filePath;//
  4.  
    const char* path = filePath.c_str();
  5.  
     
  6.  
    // file buffer
  7.  
    //char* buf = JniBridgeC::LoadFileAsBytesFromJava(path, outSize);
  8.  
    char* buf = JniBridgeC::LoadFileAsBytesFromCpp(path, outSize);
  9.  
     
  10.  
    return reinterpret_cast<csmByte*>(buf);
  11.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhehhbf
系列文章
更多 icon
同类精品
更多 icon
继续加载