Android NDK:从共享库中的资产读取文件
在我的应用程序中,我必须将文件从资产文件夹传递到共享库。 我现在不能使用jni。 我在我的项目中使用了预编译共享库,其中我有文件的硬编码路径,但我得到了错误“没有这样的文件或目录”。 因此,在我的.apk文件中,我在libs/armeabi-v7a文件夹中有.So文件,在/assets文件夹中有我的文件 我试着这样做: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); 和其他一些途径,但它不起作用 有可能吗?您的资产被
char *cert_file = "/assets/cacert.cert";
av_strdup(cert_file);
和其他一些途径,但它不起作用
有可能吗?您的资产被打包到apk中,因此您不能像您提供的示例代码那样在运行时直接引用它们。这里有两个选项:
- 将资产作为输入流进行处理,使用
Context.getAssets().open('cacert.cert')
- 将资源复制到文件目录中的本地文件,然后引用复制文件的文件名
- 在初始化库的过程中,将指针指向:
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;
- 在本机活动中,您的主要功能是作为一个paramaterandroid_app*app,您只需要在这里获取它:app->activity->assetManager
- 如果您有Java活动,那么需要通过JNI发送Java对象AssetManager的实例,然后使用该函数
第一个选项现在对我不起作用。那么第二个呢?我应该把这个文件放在哪个位置,这样我就可以从.so lib访问它了?任何实际的文件系统位置-内部存储、外部等-显然是所有通常的权衡。我相信也有从本机代码访问资产的方法,但它不仅仅是一个“文件”,所以我必须使用绝对路径?谢谢,伙计们,我来试试。不明白你们的意思。如果您指的是作为实际文件创建的副本,那么是的,您需要为本机代码提供它可以使用的路径或文件描述符。如果您指的是资产本身,它没有路径,因为它不是文件(尽管仍然可以通过特殊方式访问)。Context有一个getFileDir()方法来获取文件目录。我建议使用此选项,而不是硬编码应用程序数据目录的路径: