【问题标题】:Execute file from Android device programatically以编程方式从 Android 设备执行文件
【发布时间】:2018-11-21 23:38:57
【问题描述】:

我已经完成了我的国际象棋 UI 应用程序,现在想加载一个国际象棋引擎来测试我的 UI 是否真的与 UCI 兼容。国际象棋引擎位于 Android 设备的下载文件夹中('/storage/emulated/0/Download')。这是运行的代码:

try {
        File f  = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        String path = f.getAbsolutePath();
        String stockfishPath = path + "/Stockfish-9-armv64v8";
        engineProcess = Runtime.getRuntime().exec(stockfishPath);
        processReader = new BufferedReader(new InputStreamReader(
                engineProcess.getInputStream()));

        String sCurrentLine;

        ArrayList<String> output = new ArrayList<>();
        while ((sCurrentLine = processReader.readLine()) != null) {
            output.add(sCurrentLine);
        }

        processWriter = new OutputStreamWriter(
                engineProcess.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }

当我运行它时,它在 exec() 方法上失败,因为它声称它找不到该文件,即使该文件存在于 Android 设备上。我尝试在 exec() 方法上运行“ls”命令,但“emulated”中的文件夹是空的。造成这种情况的明显原因可能是因为我没有查看/访问这些文件的权限,但我需要知道如何做到这一点(尽管在清单文件中添加了 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE)。

是否有可能将引擎嵌入项目中的某个位置(在资源中?)并以某种方式将 adb-shell 嵌入其中?

【问题讨论】:

    标签: java android file


    【解决方案1】:

    您不能这样做,因为 SD 卡挂载了 -noexec 标志。

    将内部存储与 chmod +x 一起使用将是唯一可用的选项。

    【讨论】:

    • 它是内部存储。没有 SD 卡。你能举个例子,用 chmod +x 指定 exec 方法吗?
    • @DanZoe 这不是内部存储;看看你在上面使用外部这个词的频率。使用getFilesDir().getAbsolutePath().exec("chmod +x " + stockfishPath)。虽然它可能在没有 root 的情况下无法运行,因为 SE Linux 标签可能会阻止它这样做 - 除非是 root,否则没有可用于标记文件的 semanage 命令。
    • 我明白了。是否有另一种执行stockfish 可执行文件的方法。我已经搜索和搜索了,我唯一需要的就是实际执行它,无论位置如何。你有什么建议吗?
    • @DanZoe 你试过建议的方法了吗? “我明白了”听起来并不完全一样。
    猜你喜欢
    • 2011-12-25
    • 2012-09-18
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多