Android-0.使用AAssetManager读取asset目录内容

JNI读取安卓asset下的文件需要使用以下接口。

 #include <android/asset_manager_jni.h>
 #include <android/asset_manager.h>

对于错误undefined reference to AAssetManager_fromJava
1.使用 Android.mk ,添加LOCAL_LDLIBS :+= -landroid 解决。

 

1.JAVA层传递AssetManager对象

从java端使用getAssets()得到一个JAVA端的AAssetManager对象,通过JNI调用传递到C++端。
这里要注意,生成的对象名称是有点特别的:
比如我的原型是:

public class JAVA2C {
public native static void BrawlStars_Init_Ast(AssetManager assetManager, String strDir);
}

com.hgy413.ndkdemo包下,它自动生成的函数是:

extern "C"
JNIEXPORT void JNICALL
Java_com_hgy413_ndkdemo_JAVA2C_BrawlStars_1Init_1Ast(JNIEnv *env, jclass type, jobject assetManager,
                                                     jstring strDir_) {
           AAssetManager *pAsm = AAssetManager_fromJava(env, assetManager);
 }

注意1Init_1Ast
MainActivity中调用BrawlStars_Init_Ast(getAssets(),"assets/brawlStars");传递到C++层即可。

 

2.使用AAssetManager_open方法打开文件

这里要特别注意,如果打开的是asserts/bs/skins.csv,那么传入AAssetManager_open的是bs/skins.csv,也就是asserts/不能加上,否则会打开失败。
单文件方式:

    AAsset* asset = AAssetManager_open(m_pAsm, strPath.c_str(), AASSET_MODE_UNKNOWN);//根据文件名打开资源文件
    if (NULL != asset)
    {
        off_t bufSize = AAsset_getLength(asset);
        char *pBuf = (char *) malloc(bufSize + 1);
        memset(pBuf, 0, bufSize + 1);
        int iRealRead = AAsset_read(asset, pBuf, bufSize);
        // 读取操作
        free(pBuf);
        AAsset_close(asset);
    }
    else
    {
        MyLOGE("读取%s失败",strPath.c_str());
    }

文件夹遍历子文件列表:

     AAssetDir *assetDir = AAssetManager_openDir(m_pAsm, strDir.c_str());
    if (NULL != assetDir)
    {
        const char* cOpen = AAssetDir_getNextFileName(assetDir);
        while (NULL != cOpen)
        {
            // 转成全路径
            std::string strOpen = cOpen;
            std::string strFullOpen = strDir + "/";
            strFullOpen += strOpen;

			// todo.
            cOpen = AAssetDir_getNextFileName(assetDir);
        }
        AAssetDir_close(assetDir);
    }

参考:
https://blog.csdn.net/csdn49532/article/details/50524342
https://androidcookie.com/aassetmanager_fromjava.html
https://www.cnblogs.com/willhua/p/9692529.html
https://www.cnblogs.com/willhua/p/9692529.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
assimp-vc142-mt.dll是一个动态链接库文件,它是由ASSIMP(Open Asset Import Library)项目生成的。ASSIMP是一个开源的跨平台的模型导入库,可以用于导入各种3D模型文件格式,包括但不限于OBJ、FBX、STL、3DS等。assimp-vc142-mt.dll是该库的一个特定版本的动态链接库文件。 assimp-vc142-mt.dll的文件名中的"vc142"表示该库是与Visual Studio 2019的C++编译器(版本号为14.2)兼容的版本。"mt"表示该库是使用多线程(static multithreaded)模式进行编译的,因此在使用该库时需要注意线程安全性。 如果你在开发过程中遇到assimp-vc142-mt.dll文件缺失的错误,可能是由于该动态链接库文件不存在于你的系统路径中或者文件损坏导致的。解决这个问题的方法是确保assimp-vc142-mt.dll文件存在于你的系统路径中,并且是有效可用的版本。你可以从ASSIMP项目的官方网站或者其他可信的来源下载该文件,然后将它放置在系统路径(如Windows的System32文件夹)或者你的应用程序的工作目录中。 需要注意的是,在使用动态链接库文件时,你的操作系统必须与该文件对应的位数匹配(如32位或64位)。另外,为了正确使用assimp-vc142-mt.dll文件,你可能还需要安装相关的依赖项,如Visual Studio运行库。 总之,assimp-vc142-mt.dll是ASSIMP项目的一个特定版本的动态链接库文件,用于导入各种3D模型文件格式。如果你的应用程序缺少该文件,可以尝试下载并正确配置该文件来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值