由于这是一个很长的阅读,我将从一个非常截断的版本开始:
不管是否有适当的位置/权限/文件所有权,是否不允许本机进程创建/编辑由其生成的java进程创建的文件?
完整的问题:
我的应用程序包含一组使用NDK工具链和典型的Java Android界面编译的本机二进制文件。本机程序打包在/ assets文件夹中,并由java应用程序复制到/data/data/com.domain.app/nativeApplication文件夹中。
有两个原生应用程序有问题。一个修改由java层创建的jpeg,另一个修改jpeg并返回一个int作为输出。问题是:当java层调用时,jpeg修饰符不起作用。
我已经对它进行了大量的故障排除,所以我会尝试从一些明显的潜在答案中劝阻你。
正确编译: 通过adb shell,我可以从手机的磁盘上调用这两个程序。第二个图像分析程序在通过adb调用时或在软件中设计时顺畅运行如果我从adb手动执行中间步骤。
Permissions:
Jpg权限 - 应用程序有权写入外部存储。我试图从SD卡和/data/data/com.domain.app/nativeApp/img/name.jpg读取文件;没有快乐。如上所述,当图像位于任一位置时,第二个程序按设计运行,如果我通过adb手动运行第一个程序。
文件/文件夹权限:〜/ nativeApplication / *中的所有文件夹都是由android应用程序本身创建的,它是所有者,并且它已将所有子目录和文件chmodded为777。
支持代码:
调用jpg转换器进程:
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 call :(根据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
理论:
此时我唯一可行的理论是有一些不受chmod控制的android策略,这使得jpegtransformer在被java层调用时不会编辑图像。由于图像分析仪不会改变图像,我想它会围绕这个吗?是否不允许本机进程创建文件?任何想法都会很棒。很抱歉长时间阅读。
-SS
答案 0 :(得分:2)
当您从应用程序生成进程时,它会在您运行的同一个uid下运行,因此所有相同的Android和文件系统权限都适用。我认为你需要寻找其他的东西,比如使用不好的路径。
如果您想验证,只需使用“adb shell ps”查看正在运行的进程,您应该会看到您的进程与主应用程序具有相同的uid。
那说...... Android确实不支持这样的产卵过程,并且强烈建议不要这样做。请考虑通过将本机代码作为共享库加载并使用JNI来调用它来实现此目的。这也将更加高效,并且与您的本机代码的通信可能更简单,因为JNI是一种更丰富,更直接的方式来调用它。
答案 1 :(得分:1)
我认为您的问题与权限无关 - 您尝试使用>
重定向输出,而这是一个shell运算符,并且不能用于java。获取进程输出流并使用Java标准文件I / O API将其写入文件。
虽然我不确定这是不是问题,但是你应该没有问题来修改app文件夹中的文件,而我所描述的问题是我遇到的问题不止一次。