编写没有ndk的android gui国际象棋界面

时间:2019-01-13 05:11:37

标签: android chess

我正在寻找一种无需使用NDK和JNI即可执行国际象棋引擎(例如Stockfish)的方法。

我遇到的主要问题是,如何执行软件(如在提示中)并使它发送给我输出时保持其运行状态。

第二个更具体的问题是如何在设备上(如果有可能的话)使用已安装的国际象棋引擎。

在下面我详细说明了我想要实现的目标

我不知道我想做的事是否可行,所以我将解释:当您安装象KomodoStockfish之类的象棋引擎应用程序时,执行它们时您会看到一条消息,通知您必须下载一个GUI应用程序才能将其用作完整的国际象棋程序。任何人都可以从这些消息中推断出,GUI App可以利用设备中已安装的引擎。

有没有办法查看设备上已安装的引擎以显示在选择框上,并从应用程序中“提取”这些引擎,或者找到它们在设备中的位置,或者通过其他应用程序执行这些应用程序类似于意图?

问题在于国际象棋引擎是必须保持运行以利用某个位置的软件;您向他们发送您希望他们使用的职位,并在他们进行分析时,他们会继续向您发送其空置信息,并且他们会一直保持这种状态,直到您向他们发送命令停止为止。

如果在Windows提示符下执行Stockfish,则可以清楚地看到我在说什么。当它执行时,它会等待命令。他们给您发送命令“ uci”;然后您发送一个命令,例如“ position fen”,然后发送“ go infinite”,它们开始计算并不断发送有关其计算的输出。

因此,我想创建一个利用设备中已安装引擎的应用程序。

直到现在,我还没有发现如何做到这一点。我不得不下载DoidFish应用程序源代码,并分析了他们的工作...,他们得到了stockfish的源代码并使用JNI执行。

但是这样一来,我的应用程序上就会有固定且有限的引擎列表,而我会忽略那些没有开源的引擎,例如Komodo和Houdini。我看到Chessbase应用程序可以使用多个引擎,如您在应用程序页面的屏幕快照中所见。他们还在列表中显示了Komodo引擎(当我购买该应用程序以查看时)...我已经安装了Komodo ...所以他们不得不以其他方式做...

由于无法解决问题,我下载了鳕鱼的编译后的arm版本,并尝试使用运行时的exec方法执行它,例如:

Runtime rt = Runtime.getRuntime();
String[] commands = {enginePath, "uci"};

Process proc = rt.exec(commands);

但是,引擎是您必须执行的软件,并且如我之前所解释的,当您向其发送命令时,它必须保持运行,但是通过这种方式,我执行了引擎,然后将其发送给我(我使用了BufferedReader),然后停止执行。

抱歉这么大的文字,您能帮我弄清楚吗?

2 个答案:

答案 0 :(得分:0)

如果您想知道Stockfish如何将自己展示给其他国际象棋GUI应用程序,请查看Stockfish Chess source code

请注意,您需要了解Bound ServicesAIDL,它们是Android的高级主题。因此,只要特定的象棋引擎适当地支持interface ccc.chess.engines.IChessEngineService,GUI应用程序便可以使用相同的机制与之通信。

正如您所知,虽然这将描述如何建立连接,但是引擎和GUI之间的协议将为the Universal Chess Interface

答案 1 :(得分:0)

为了保持引擎运行,我不得不使用 ProcessBuild 创建一个进程。

为此,我使用了以下代码:

    process = processBuilder.start(); // To run the engine

    //
    // Start the thread that will handle the responses of the engine.
    //
    Thread responseThread = new Thread(runnableobject);
    responseThread.start(); // Then treat the response in this file

要获取已安装的引擎,我使用了意图“ intent.chess.provider.ENGINE”