JNI C 代码中的 fopen 对于放置在 android 应用程序资产文件夹中的文件失败

fopen in JNI C code get failed for file placed in assets folder in android application

我在 android 应用程序的资产文件夹中保留了一些文件。

现在我编译该应用程序并获得 apk。 [当我提取该 apk 时,我的文件在资产文件夹中]

现在我在移动设备上安装那个 apk

并且在该应用程序中有一些使用 JNI 接口的 C 编程代码。

现在我的 fopen() 对该文件的 c 编程调用失败了。

fopen("myfile","r");

我在安装 apk 时知道 android 将资产文件复制到 /data/data/com.packagename/something

有人知道那条路所以我可以在 fopen()

中给出

或者是否有任何其他方法可以在 C 编程中打开该文件。


如果我将这些文件保存在 sdcard 文件夹中并像 fopen("/sdcard/myfile","r"); 一样访问,那么它就可以工作。但我只想将这些文件保留在资产文件夹中

您可以使用资产管理器访问 JNI 代码中的资产。它是 NDK 的一部分。

http://developer.android.com/ndk/reference/group___asset.html

类似于:

EXPORT_API void LoadAsset(char* filename, jobject assetManager){
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_BUFFER);
    AAsset_read(asset, ...);
}

然后在 Java 中是这样的:

LoadAsset("myfile", getContext().getAssetManager());

我发现的一种方法是在代码中编写测试行,例如:

System.out.println("Working Directory = " +
              System.getProperty("user.dir"));

现在,如果您知道 Android、/data/data/com.packagename/assets/file.png 存储您的资产的位置,那么您将知道资产的相对或绝对路径。我希望这对你有用,对我有帮助!