我正在寻找一种无需使用NDK和JNI即可执行国际象棋引擎(例如Stockfish)的方法。
我遇到的主要问题是,如何执行软件(如提示中所示)并使其在发送给我输出时保持运行。
第二个更具体的问题是如何在设备上(如果有可能的话)使用已安装的国际象棋引擎。
下面我详细说明我要实现的目标
我什至不知道我想做什么,所以我将解释:当您安装象Komodo或Stockfish之类的象棋引擎应用程序时,执行它们时会看到一条消息,提示您必须下载一个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),然后停止执行。
对不起这么大的文字,您能帮我弄清楚吗?
最佳答案
如果您想知道Stockfish如何将自己展示给其他国际象棋GUI应用程序,请查看Stockfish Chess source code。
请注意,您需要了解Bound Services和AIDL这是Android的高级主题。因此,只要特定的象棋引擎适当地支持interface ccc.chess.engines.IChessEngineService
,GUI应用程序便可以使用相同的机制与之通信。
虽然这将描述如何建立连接,但是您知道,引擎和GUI之间的协议为the Universal Chess Interface