首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法与“Stockfish-9-ARMv 7”二进制文件通信

无法与“Stockfish-9-ARMv 7”二进制文件通信
EN

Stack Overflow用户
提问于 2018-05-13 16:37:21
回答 1查看 1.1K关注 0票数 1

我正在Unity3D开发一个象棋游戏。我想为Android平台开发它。对于人工智能,我是使用斯托克菲斯国际象棋引擎。我下载了Android的Stockfish二进制文件,名为“Stockfish-9-ARMv 7”。我将这个二进制文件放在我的StreamingAssets文件夹中,以便它在构建步骤中正确地进入目标平台。一切都很好,直到这里,即当我构建我的团结项目,文件放在正确的位置,我可以很好地看到它。

现在,为了让我的人工智能工作,我必须使用UCI协议与这个二进制文件进行通信。因此,我在Unity中编写了一个C#脚本,该脚本创建一个进程来运行二进制文件并与其通信。但这不管用。

但是,当我在Windows上做同样的事情时--即使用名为"stockfish_9_x64.exe“的斯德哥尔摩鱼的windows二进制版本,并将其构建为一个独立的应用程序,一切都很完美,我能够通过我的C#代码与引擎通信。

我在网上研究过,但找不到很多资源和指导。我找到了一个类似职位,并阅读了它,使我得出结论,也许它与文件权限有关。问这个问题的人实际上通过编写这两行代码解决了这个问题:

代码语言:javascript
复制
string[] cmd = { "chmod", "744", Path.Combine(strToFolder, fileName) };
Java.Lang.Runtime.GetRuntime().Exec(cmd);  

然而,他使用的是Xamarin,并且可以访问库。我使用的是统一和C#,我真的不知道如何更改这个二进制文件的执行/运行权限并运行它。事实上,我甚至不知道这是否是问题所在。

我只想把河豚整合到以Android为目标平台的团结项目中。如果有人有任何想法,建议,如果有人曾经这样做过,请指导我。即使我从一开始就错了,而且我的方法是错误的,也请让我知道这一点以及修正的方法。

下面是我的代码:

代码语言:javascript
复制
public class CommunicateWithEngine {

    public static Process mProcess;

    public static void Communicate()
    {
        // since the apk file is archived this code retreives the stockfish binary data and
        // creates a copy of it in the persistantdatapath location.
        string filepath = Application.persistentDataPath + "/" + "Stockfish-9-armv7";
        if (!File.Exists(filepath))
        {
            WWW executable = new WWW("jar:file://" + Application.dataPath + "!/assets/" + "Stockfish-9-armv7");
            while (!executable.isDone)
            {
            }
            File.WriteAllBytes(filepath, executable.bytes);
        }

        // creating the process and communicating with the engine
        mProcess = new Process();
        ProcessStartInfo si = new ProcessStartInfo()
        {
            FileName = System.IO.Path.Combine(Application.persistentDataPath, "Stockfish-9-armv7"),
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardError = true,
            RedirectStandardInput = true,
            RedirectStandardOutput = true
        };
        mProcess.StartInfo = si;
        mProcess.OutputDataReceived += new DataReceivedEventHandler(MProcess_OutputDataReceived);
        mProcess.Start();
        mProcess.BeginErrorReadLine();
        mProcess.BeginOutputReadLine();

        SendLine("uci");
        SendLine("isready");

    }


    private static void SendLine(string command) {
        mProcess.StandardInput.WriteLine(command);
        mProcess.StandardInput.Flush();
    }

    private static void MProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        string text = e.Data;
        Test.PrintStringToTheConsole(text);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-07 19:01:46

对于那些和OP和我一样挣扎着的人。12小时后,搜索和谷歌这里是一个解决方案。您可以使用可执行的河豚二进制文件,但是您必须将二进制文件的扩展名更改为.so,并在文件夹/Asset/Plugins/Android中统一导入它。生成之后,您可以在文件夹/data/data//lib中的设备上找到它。在这里,您可以执行它并获得输入和输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50318339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档