Невозможно связаться с двоичным файлом "Stockfish-9-armv7"
Я занимаюсь разработкой игры в шахматы в Unity3D. Я хочу разработать его для платформы Android. Для AI я использую шахматный движок Stockfish. Я скачал двоичный файл Stockfish для Android под названием "Stockfish-9-armv7". Я поместил этот бинарный файл в папку StreamingAssets, чтобы он правильно вошел в целевую платформу на этапе сборки. Пока все работает нормально, т.е. когда я собираю свой проект Unity, файл помещается в правильное место, и я очень хорошо это вижу.
Теперь, чтобы мой AI работал, я должен общаться с этим двоичным файлом, используя протоколы UCI. И поэтому я написал сценарий C# в своем проекте Unity, который создает процесс для запуска двоичного файла и связи с ним. Но это не работает.
Однако, когда я делаю то же самое для Windows, то есть использую двоичную версию Stockfish для Windows с именем stockfish_9_x64.exe и собираю ее как отдельное приложение, все работает отлично, и я могу общаться с движком через мой код C#.
Я исследовал это онлайн, но не мог найти много ресурсов и руководства. Я нашел похожий пост и, прочитав его, заставил меня заключить, что, возможно, это как-то связано с правами доступа к файлам. Парень, который задал этот вопрос, на самом деле решил проблему, написав эти две строки кода:
string[] cmd = { "chmod", "744", Path.Combine(strToFolder, fileName) };
Java.Lang.Runtime.GetRuntime().Exec(cmd);
Однако он использовал Xamarin и имел доступ к библиотеке времени выполнения Java. Я использую Unity и C#, и я действительно не знаю, как изменить разрешение на выполнение / запуск этого двоичного файла и запустить его. На самом деле я даже не знаю, в этом проблема или нет.
Я просто хочу интегрировать Stockfish в свой проект Unity с Android в качестве целевой платформы. Если у кого-то есть какие-либо идеи, предложения или кто-то делал это раньше, пожалуйста, направьте меня Даже если я ошибаюсь с самого начала и мой подход ошибочен, дайте мне знать об этом вместе с исправленным подходом.
Ниже приведен мой код:
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);
}
}
0 ответов
Для всех, кто борется с той же проблемой, что и OP и я. После 12 часов поиска и поиска в Google вот решение. Вы можете использовать исполняемый двоичный файл stockfish, но вам нужно изменить расширение для двоичного файла на.so и импортировать его в единстве в папке /Assets/Plugins/Android. После сборки вы можете найти его на устройстве в папке / data / data // lib. Здесь вы можете выполнить его и получить ввод и вывод.