Android NDK:从共享库中的资产读取文件

Android NDK:从共享库中的资产读取文件,android,android-ndk,shared-libraries,android-assets,Android,Android Ndk,Shared Libraries,Android Assets,在我的应用程序中,我必须将文件从资产文件夹传递到共享库。 我现在不能使用jni。 我在我的项目中使用了预编译共享库,其中我有文件的硬编码路径,但我得到了错误“没有这样的文件或目录”。 因此,在我的.apk文件中,我在libs/armeabi-v7a文件夹中有.So文件,在/assets文件夹中有我的文件 我试着这样做: char *cert_file = "/assets/cacert.cert"; av_strdup(cert_file); 和其他一些途径,但它不起作用 有可能吗?您的资产被

在我的应用程序中,我必须将文件从资产文件夹传递到共享库。 我现在不能使用jni。 我在我的项目中使用了预编译共享库,其中我有文件的硬编码路径,但我得到了错误“没有这样的文件或目录”。 因此,在我的.apk文件中,我在libs/armeabi-v7a文件夹中有.So文件,在/assets文件夹中有我的文件

我试着这样做:

char *cert_file = "/assets/cacert.cert";
av_strdup(cert_file);
和其他一些途径,但它不起作用


有可能吗?

您的资产被打包到apk中,因此您不能像您提供的示例代码那样在运行时直接引用它们。这里有两个选项:

  • 将资产作为输入流进行处理,使用
Context.getAssets().open('cacert.cert')

  • 将资源复制到文件目录中的本地文件,然后引用复制文件的文件名

可以简单地在C++中使用AsAsTeMeMeor类。 基本上你需要:

  • 在初始化库的过程中,将指针指向:
    AAssetManager*assetManager
  • 使用它读取您的文件:

    // Open your file
    AAsset* file = AAssetManager_open(assetManager, filePath, AASSET_MODE_BUFFER);
    // Get the file length
    size_t fileLength = AAsset_getLength(file);
    
    // Allocate memory to read your file
    char* fileContent = new char[fileLength+1];
    
    // Read your file
    AAsset_read(file, fileContent, fileLength);
    // For safety you can add a 0 terminating character at the end of your file ...
    fileContent[fileLength] = '\0';
    
    // Do whatever you want with the content of the file
    
    // Free the memoery you allocated earlier
    delete [] fileContent;
    
你可以找到那个

编辑: 要获取AAssetManager对象,请执行以下操作:

  • 在本机活动中,您的主要功能是作为一个paramaterandroid_app*app,您只需要在这里获取它:app->activity->assetManager
  • 如果您有Java活动,那么需要通过JNI发送Java对象AssetManager的实例,然后使用该函数

第一个选项现在对我不起作用。那么第二个呢?我应该把这个文件放在哪个位置,这样我就可以从.so lib访问它了?任何实际的文件系统位置-内部存储、外部等-显然是所有通常的权衡。我相信也有从本机代码访问资产的方法,但它不仅仅是一个“文件”,所以我必须使用绝对路径?谢谢,伙计们,我来试试。不明白你们的意思。如果您指的是作为实际文件创建的副本,那么是的,您需要为本机代码提供它可以使用的路径或文件描述符。如果您指的是资产本身,它没有路径,因为它不是文件(尽管仍然可以通过特殊方式访问)。Context有一个getFileDir()方法来获取文件目录。我建议使用此选项,而不是硬编码应用程序数据目录的路径: