【问题标题】:Android NDK: read file from assets inside of shared libraryAndroid NDK:从共享库内的资产中读取文件
【发布时间】:2014-06-15 20:56:25
【问题描述】:

在我的应用程序中,我必须将文件从 assets 文件夹传递到 shared library。 我现在不能使用 jni 来做到这一点。 我在我的项目中使用了预编译的共享库,其中我已经硬编码了我的文件的路径,但是我收到错误 “没有这样的文件或目录”。 所以在我的 .apk 文件中,我在 libs/armeabi-v7a 文件夹中有 .so 文件,在 /assets 中有我的文件em> 文件夹。

我尝试过这样做:

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

还有其他一些路径,但它不起作用。

有可能吗?

【问题讨论】:

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


    【解决方案1】:

    您可以简单地使用 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 对象:

    • 在原生 Activity 中,你的 main 函数作为参数 android_app* app,你只需要在这里获取它:app->activity->assetManager
    • 如果你有一个 Java 活动,你需要通过 JNI 发送一个 java 对象 AssetManager 的实例,然后使用函数AAssetManager_fromJava()

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 第一个选项现在对我不起作用。第二个呢?我应该把这个文件放在哪个位置,这样我才能从 .so lib 访问它?
      • 任何实际的文件系统位置 - 内部存储、外部存储等 - 显然需要进行所有通常的权衡。我相信也有从本机代码访问资产的方法,但它不仅仅是一个“文件”。
      • 所以我必须使用绝对路径?谢谢各位,我试试看。
      • 不清楚你的意思。如果您的意思是作为实际文件创建的副本,那么是的,您需要向本机代码提供它可以使用的路径或文件描述符。如果您指的是资产本身,它没有路径,因为它不是文件(尽管仍然可以通过特殊方式访问)。
      • Context 有一个 getFilesDir() 方法来获取你的文件目录。我建议使用此方法而不是硬编码应用程序数据目录的路径:developer.android.com/reference/android/content/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2012-10-30
      • 2018-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      相关资源
      最近更新 更多