直接在c+中访问Android APK资产数据+;没有资产管理器和复制 我在我的引擎中使用纯C++来创建Android游戏引擎。没有单一的java文件。基本上,这是一个只应存储到外部存储器的游戏。当我通过adb手动将我的资产数据移动到我的外部sd卡时,游戏已经运行良好且稳定 adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/

直接在c+中访问Android APK资产数据+;没有资产管理器和复制 我在我的引擎中使用纯C++来创建Android游戏引擎。没有单一的java文件。基本上,这是一个只应存储到外部存储器的游戏。当我通过adb手动将我的资产数据移动到我的外部sd卡时,游戏已经运行良好且稳定 adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/,android,c++,native,apk,native-activity,Android,C++,Native,Apk,Native Activity,这不是一个好的解决方案,因为它无法交付。因此,我将资产数据保存在资产文件夹中 在构建过程中,将以以下结构移动到apk文件中: 资产/数据/MoreFolders/Withsubfolders 资产/Data/EngineData.zip Assets/Data/ScriptData.zip 但是我不知道文件系统在文件系统上是用C++代码访问它们的。 所以我试图找到文件目录的路径。由于本机活动状态中的错误 我必须用普通代码检索信息 // bug in 2.3 internalDataPath /

这不是一个好的解决方案,因为它无法交付。因此,我将资产数据保存在资产文件夹中 在构建过程中,将以以下结构移动到apk文件中:

资产/数据/MoreFolders/Withsubfolders 资产/Data/EngineData.zip Assets/Data/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);
与android.os.Environment.getFilesDir()等效的c++代码 以及android.os.Environment.getExternalStorageState()等

它工作得很好,结果

内部路径=/data/data/com.fantasyhaze.rememory/files

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

外部路径=/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

但是,通过asset manager将所有数据从资产文件夹(无论在何处)移动到此文件夹会导致内存消耗翻倍

资产>1GB意味着资产>2GB,这毫无意义。除此之外,assert文件夹似乎不会反复工作,而且只适用于小数据文件 这在使用较大的pak文件时是不可能的。使用时,可能可以直接从apk访问文件 解压系统,然后uzip我的ressource文件,但因此我必须选择apk路径

所以我的问题是:

  • 文件系统上apk中的资产文件夹在哪里
  • 检索apk位置或可执行文件位置的代码(c++)是什么
  • 我可以使用普通的文件打开方法直接访问它,或者只有在解包时才能访问它。如果我不用打开包装就可以使用它,如何使用
  • 如果安装了sd卡,检索信息的代码(c++)是什么
  • 我希望有人能帮我:)


    编辑:添加了缓存目录和包目录代码(以及它的输出路径),以便为其他需要它的人提供源代码。

    我发布了一个答案,而不是将其标记为重复,因为从技术上讲,您要求的详细信息比我将在此处链接的问题/答案中提供的要多。因此,要回答您4点中的第一点,请参阅


    至于检查SD卡是否已安装,这应该相当简单。只要尝试打开SD卡上的目录或文件(您知道应该在那里),如果失败,您就知道SD卡不可用。请参阅。

    您可能需要查看“扩展文件”请参阅

    据我所知,这为您提供了一个系统,可以自动将资源文件(扩展文件)放在“共享存储位置”上

    因此,我认为这将解决重复数据的问题


    还有一个简短的介绍。

    由于Android本机实现的某些版本中存在漏洞,从NDK端获取资产既棘手又不可靠。让我找到nfo,然后再联系你。如果你不想使用NativeActivity,你可以使用这种方法(仅供将来参考)来查找APK和加载资产。嗨,我想在这个问题中使用这个代码。我需要获取.apk文件的“getPackageCodePath”路径和内部目录路径。但这是不断抛出我的错误,不能打电话。有人能帮我吗??提前谢谢。在MainActivity中,我有:public native int test();并加载库。在C代码中,我正在调用JNI方法,与.apk的给定“包代码路径”相同:我得到的错误是:JNI在应用程序中检测到错误:无法调用java.lang.String android.content.ContextWrapper.getPackageCodePath()对java.lang.Class实例调用CallObjectMethodThx以获取信息,搜索了这么久,但在链接2中找不到这篇文章!有了这些信息,我终于可以检索apk的位置:)在第一篇文章中添加了代码,以不同于链接中的形式提供它。检查文件是可以的,但我认为可能有一些方法可以检查sd卡是否以c代码装载,类似于:
    android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_mounted)如中所示,我不知道有50MBs的限制!!!关于apk文件大小?这太可怕了,这些扩展文件可以解决问题,但是,是否有任何源代码可以使用C/C++中的AStorageManager来访问odb文件?在本机c中重新实现下载程序似乎需要做很多工作:/
    
                // 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, mid_getExtStorage, NULL);
            cls_File = jni_env->FindClass("java/io/File");
            mid_getPath = jni_env->GetMethodID(cls_File, "getPath", "()Ljava/lang/String;");
            obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
            path = jni_env->GetStringUTFChars(obj_Path, NULL);
            FHZ_PRINTF("EXTERNAL PATH = %s\n", path);
            jni_env->ReleaseStringUTFChars(obj_Path, 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, mid_getPath);
            path = jni_env->GetStringUTFChars(obj_Path, NULL);
            FHZ_PRINTF("Looked up package code path = %s\n", path);