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

时间:2014-04-29 18:45:20

标签: android android-ndk shared-libraries android-assets

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

我试过这样做:

char *cert_file = "/assets/cacert.cert";
av_strdup(cert_file);

以及其他一些路径,但它不起作用。

有可能吗?

2 个答案:

答案 0 :(得分:14)

您可以在C ++中使用AAssetManager类。

基本上你需要:

  • 在你的图书馆初始化期间,获得一个指针: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;
    

您可以找到official ndk documentation here

  

编辑:   获取AAssetManager对象:

     
      
  • 在原生活动中,您主要作为参数 android_app * app ,您只需要在此处获取:app-> activity-> assetManager
  •   
  • 如果您有Java活动,则需要通过JNI发送java对象AssetManager的实例,然后使用函数AAssetManager_fromJava()
  •   

答案 1 :(得分:2)

您的资产已打包到您的apk中,因此您无法在运行时直接引用它们,就像您提供的示例代码一样。这里有2个选项:

  • 使用
  • 处理资产作为输入流

Context.getAssets().open('cacert.cert')

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