Активы, андроид, с, средой JNI

Как получить доступ к активу Android ,например.txt-файл, из C с JNI?

Я пытаюсь " файл:/ / / android_asset / myFile.txt "и локально" myFile.txt " с дубликатом myFile.txt в папке jni с файлом реализации C.

2 ответов


дело в том, что вы не можете получить к ним прямой доступ в виде файлов. Это связано с тем, что активы считываются непосредственно из APK. Они не распаковываются в заданную папку после установки.

начиная с Android 2.3, существует API C для доступа к активам. Взгляните на <android/asset_manager.h> и assetManager поле в <android/native_activity.h>. Я никогда не использовал это, и я не уверен, что вы можете использовать этот API asset manager, если вы не полагаетесь на родную активность. И в любом случае, это не сработает. Android 2.2 и ниже.

Итак, я вижу три варианта:

  • вы можете извлечь активы в какой-то каталог, но это займет дополнительное пространство
  • вы можете (bunlde и) использовать что-то вроде libzip для чтения активов из APK в чистом C.
  • или, чтобы избежать связывания дополнительной библиотеки, мое личное предпочтение-читать данные в C, используя JNI, из Java

если вы не можете использовать API AssetManager C, потому что вам нужно вызвать библиотеку C/C++, которая требует имени файла, вместо этого можно использовать необработанный ресурс.

единственным недостатком является то, что он должен быть скопирован в dir данных вашего приложения (temp) во время выполнения.

поместите файл в res / raw

поместите файл, который вы хотите прочитать из собственного кода в res/raw реж.

создать копию

во время выполнения скопируйте файл из res/raw/myfile.xml к data реж:

File dstDir = getDir("data", Context.MODE_PRIVATE);
File myFile = new File(dstDir, "tmp_myfile.xml");
FileMgr.copyResource(getResources(), R.raw.my_file, myFile);

теперь имя файла для передачи в ваш собственный код -myFile.getAbsolutePath()

copyResource (rsrcId, dstFile)

public static File copyResource (Resources r, int rsrcId, File dstFile) throws IOException
{
    // load cascade file from application resources
    InputStream is =  r.openRawResource(rsrcId);
    FileOutputStream os = new FileOutputStream(dstFile);

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = is.read(buffer)) != -1)
        os.write(buffer, 0, bytesRead);
    is.close();
    os.close();

    return dstFile;
}