Активы, андроид, с, средой 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;
}