Поскольку это оказалось длинным чтением, я начну с очень урезанной версии:
Разрешено ли собственным процессам создавать / редактировать файлы, созданные их порождающим процессом Java, независимо от наличия соответствующего местоположения/ разрешение / владение файлом?
Полный вопрос:
Мое приложение состоит из набора собственных двоичных файлов, скомпилированных с помощью цепочки инструментов NDK, и типичного Java-интерфейса Android.Собственные программы упакованы в папку / assets и скопированы java-приложением в папку /data/data/com.domain.app/nativeApplication.
Существует два рассматриваемых нативных приложения.Один, который изменяет jpeg, созданный слоем java, и второй, который анализирует этот jpeg и возвращает int в качестве вывода.Проблема заключается в следующем: при вызове слоем java модификатор jpeg не работает.
Я уже выполнил немало проблем, поэтому постараюсь отговорить вас от некоторыхочевидные потенциальные ответы, начиная с самых очевидных.
Правильная компиляция: через оболочку adb я могу вызывать обе эти программы, как есть, с диска телефона.Вторая программа-анализатор изображений работает без перебоев при вызове через adb или в соответствии с инструкциями в программном обеспечении, ЕСЛИ я делаю промежуточный шаг вручную из adb.
Разрешения:
Разрешение Jpg - Приложение имеетразрешение на запись во внешнее хранилище.Я попытался прочитать файл с SD-карты и /data/data/com.domain.app/nativeApp/img/name.jpg;нет радостиКак уже говорилось, вторая программа работает так, как задумано, когда изображение находится в любом месте, , если Я вручную запускаю первую программу через adb.
Разрешения для файлов / папок: все папки в ~ /nativeApplication / * было создано самим приложением для Android, оно является владельцем и изменило все подкаталоги и файлы на 777.
Код поддержки:
Вызов конвертера jpgprocess:
NativeSetup.changePermission("/data/data/com.domain.program/nativeApp/img/img1.jpg");
try {
Process jpegConvert = Runtime.getRuntime().exec("/data/data/com.domain.program/nativeApp/bin/jpegtransformer -opts /data/data/com.domain.program/nativeApp/img/img1.jpg > /data/data/com.domain.program/nativeApp/img/img2.jpg");
jpegConvert.waitFor();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Вызов, используемый для создания файлов в ~ / nativeApp / *
private static void copyFile(String assetPath, String localPath, Context context) {
try {
InputStream in = context.getAssets().open(assetPath);
FileOutputStream out = new FileOutputStream(localPath);
int read;
byte[] buffer = new byte[4096];
while ((read = in.read(buffer)) > 0) {
out.write(buffer, 0, read);
}
Вызов chmod: (работает в соответствии с ls -l через adb)
static void changePermission(String localPath) {
try {
Process chmod = Runtime.getRuntime().exec("/system/bin/chmod 777 " +localPath);
chmod.waitFor();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
out.close();
in.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
Разрешения файла, который программа не может редактировать, а затем вывести измененную копию:
~/nativeApp/img $ ls -l
-rwxrwxrwx app_89 app_89 93061 2011-07-23 18:38 img1.jpg
Разрешение приложения, которое не может редактировать вышеуказанный jpg:
~/nativeApp/bin $ ls -l jpegtransformer
-rwxrwxrwx app_89 app_89 95268 2011-07-23 18:01 jpegtransformer
Разрешения для папок в ~ / nativeApp / ~ / nativeApp $ ls -l drwxrwxrwx app_89 app_89 2011-07-23 17:57 bin drwxrwxrwx app_89 app_89 2011-07-23 18:27 img
Теории:
На данный момент моя единственная жизнеспособная теориячто существует некоторая политика Android, не регулируемая chmod, которая не позволяет jpegtransformer редактировать изображение при вызове слоем java.Поскольку анализатор изображений не меняет изображение, я полагаю, что оно обходит это?Разве собственные процессы не могут создавать файлы?Любые идеи будут великолепны.Извините за долгое чтение.
-SS