在没有资产管理器的情况下直接访问Android APK资产数据并进行复制

前端之家收集整理的这篇文章主要介绍了在没有资产管理器的情况下直接访问Android APK资产数据并进行复制前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在引擎中使用纯C来在 android中创建一个游戏引擎.没有单个 java文件.基本上这是一个只能存储到外部存储器的游戏.当我通过adb手动将资产数据通过adb移动到我的外部SD卡时,游戏的工作已经很好,稳定.
adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/

这不是一个很好的解决方案,因为它不能交付.所以我有资产资料在资产文件
它在构建过程中被移动到apk文件中,具有以下结构:

资产/数据/ MoreFolders / Withsubfolders
资产/数据/ EngineData.zip
资产/数据/ ScriptData.zip

但是我不知道这些文件在哪些文件系统上以c代码访问它们.

所以我试图获取文件目录的路径.并且由于在本地活动状态的错误
我必须以正常代码检索信息.

// bug in 2.3 internalDataPath / externalDataPath = null using jni code instead
//FHZ_PRINTF("INTERNAL inter PATH = %s\n",state->activity->internalDataPath);  
//FHZ_PRINTF("EXTERNAL inter PATH = %s\n",state->activity->externalDataPath);

c代码相当于android.os.Environment.getFilesDir()
和android.os.Environment.getExternalStorageState()等等

// getPath() - java
        JNIEnv *jni_env = Core::HAZEOS::GetJNIEnv();
        jclass cls_Env = jni_env->FindClass("android/app/NativeActivity");
        jmethodID mid_getExtStorage = jni_env->GetMethodID(cls_Env,"getFilesDir","()Ljava/io/File;");
        jobject obj_File = jni_env->CallObjectMethod( gstate->activity->clazz,mid_getExtStorage);
        jclass cls_File = jni_env->FindClass("java/io/File");
        jmethodID mid_getPath = jni_env->GetMethodID(cls_File,"getPath","()Ljava/lang/String;");
        jstring obj_Path = (jstring) jni_env->CallObjectMethod(obj_File,mid_getPath);
        const char* path = jni_env->GetStringUTFChars(obj_Path,NULL);
        FHZ_PRINTF("INTERNAL PATH = %s\n",path);
        jni_env->ReleaseStringUTFChars(obj_Path,path);

        // getCacheDir() - java
        mid_getExtStorage = jni_env->GetMethodID( cls_Env,"getCacheDir","()Ljava/io/File;");
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz,mid_getExtStorage,NULL);
        cls_File = jni_env->FindClass("java/io/File");
        mid_getPath = jni_env->GetMethodID(cls_File,"getAbsolutePath","()Ljava/lang/String;");
        obj_Path = (jstring) jni_env->CallObjectMethod(obj_File,mid_getPath);
        path = jni_env->GetStringUTFChars(obj_Path,NULL);
        FHZ_PRINTF("CACHE DIR = %s\n",path); 
        jni_env->ReleaseStringUTFChars(obj_Path,path);

        // getExternalFilesDir() - java
        mid_getExtStorage = jni_env->GetMethodID( cls_Env,"getExternalFilesDir","(Ljava/lang/String;)Ljava/io/File;");
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz,NULL);
        FHZ_PRINTF("EXTERNAL PATH = %s\n",path);

        //getPackageCodePath() - java
        mid_getPath = jni_env->GetMethodID(cls_Env,"getPackageCodePath","()Ljava/lang/String;"); 
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz,mid_getPath); 
        obj_Path = (jstring) jni_env->CallObjectMethod(obj_File,NULL);
        FHZ_PRINTF("Looked up package code path = %s\n",path);

这样做效果很好,结果如此

INTERNAL PATH = /data/data/com.fantasyhaze.rememory/files

CACHE DIR = /data/data/com.fantasyhaze.rememory/cache

EXTERNAL PATH = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files

查找包代码路径= /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk

但资产文件夹中没有文件

我需要访问一个文件夹作为正常工作目录来读取文件.这将是可能的

/mnt/sdcard/Android/data/com.fantasyhaze.rememory/files/Data

但是通过资产管理器将资产文件夹(无论在哪里)移动到该文件夹​​,都会导致内存消耗增加一倍.

资产> 1GB意味着资产> 2GB这是没有意义的.不仅如此,assert文件夹似乎不能重复工作,只适用于小数据文件
使用较大的pak文件时是不可能的.也许这些文件可以直接从apk中使用
解压缩系统然后uzip我的资源文件,但因此我必须选择apk路径.

所以我的问题:

>文件系统中的apk中的Assets文件夹在哪里?
>(c)检索apk的位置或可执行文件的位置是什么?
>我可以使用正常的文件打开方法直接访问它,或者只有在我打开它的时候才能访问它.如果我可以在没有拆包的情况下使用它,怎么办?
>如果安装了SD卡,代码(c)将检索信息是什么?

我希望有人可以帮助我:)

编辑:添加缓存目录和软件包目录代码(它的输出路径),为所有需要它的人提供源代码.

解决方法

我发布一个答案,而不是将其标记为重复,因为在技术上,您要求更多的细节,而不是我将在此链接的问题/答案中提供的详细信息.所以,要回答你的4分中的第一个,见 Obtaining the name of an Android APK using C++ and the NativeActivity class.

为了检查SD卡是否安装,那应该是简单的.只需尝试打开目录或SD卡上的文件(您知道应该在那里),如果失败,您知道SD卡不可用.见What’s the best way to check if a file exists in C? (cross platform).

猜你在找的Android相关文章