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

write an android gui chess interface without ndk

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

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

第二个也是更具体的问题是如何在设备上获取已安装的国际象棋引擎,如果可能的话(以及是否有办法使用它们)。

下面我详细说一下我要实现的目标

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

有没有办法查看设备上已安装的引擎以显示在 select 框中,并 "extract" 从应用程序中查看这些引擎,或者找到它们在设备中的位置, 或者通过类似于 intents 的其他方式执行应用程序?

问题是国际象棋引擎是一个必须保持运行可用位置的软件;你向他们发送你希望他们利用的职位,当他们分析时,他们会不断向你发送他们的评估,他们会一直这样做,直到你向他们发送停止命令。

如果在Windows的提示符下执行Stockfish,就可以看清楚我在说什么了。当它执行时,它等待命令;你向他们发送命令 "uci";然后你发送一个像 "position fen " 这样的命令,然后你发送 "go infinite" 然后他们开始计算并不断发送关于他们计算的输出。

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

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

但那样的话,我的应用程序中就会有一个固定且有限的引擎列表,而且我会省去没有开源的引擎,例如 Komodo 和 Houdini。我看到 Chessbase 应用程序可以使用多个引擎,正如您在应用程序页面的屏幕截图中看到的那样。他们还在列表中显示了 Komodo 引擎(正如我购买应用程序看到的那样)...我安装了 Komodo...所以他们不得不以其他方式进行...

由于无法解开谜团,我下载了stockfish的编译arm版本,并尝试使用Runtime的exec方法执行它,如:

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

Process proc = rt.exec(commands);

然而,引擎是一个你必须执行的软件,当你向它发送命令时,它必须保持 运行 正如我之前解释的那样,但是我以这种方式执行了引擎,然后它发送给我一个输出(我得到了 BufferedReader)然后停止执行。

抱歉,文字太大了,你能帮我弄清楚吗?

如果您想知道 Stockfish 如何将自己暴露给不同的国际象棋 GUI 应用程序,请查看 Stockfish Chess source code

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

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

为了保留引擎 运行,我不得不使用 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"

Playstore 规则 阻止使用引擎编译 GUI;但您可以在线托管引擎,使用 Yandex.Disk 或 bubble.io 和 googledrive 创建 PWA,或者为 F-Droid 创建 APK 应用程序; (更多内容见下文)。

这消除了您的编译问题并将它们换成其他问题。

Android使用OEX开放交换协议; GUI 必须支持这一点。 (比如 droidfish 支持这个,并且 droidfish 的一个 git 分支叫做 'Harmon Honey App');

Android NDK用于将c++编译成可安装的apk (Gradle);
这就是您获得“启动画面”的原因。 使用 NDK,引擎在设计上被视为 java 应用程序; 当开发人员在 android 工作室中编译引擎时,他们选择了该模板。 2021年可以打开Android studio --> File--> New --> C++ Native --> 之前这个选项是不存在的,NDK是side loaded的。您别无选择,只能创建模板。

OEX 应用程序的发布者不是开发者。我给 Karl Schreiner 发了邮件,他在 Playstore 上发布了很多引擎;他迅速回复了我并且知识渊博,但表示他不会编译它们或不知道如何编译。我联系了 Acid-Ape-Studio 的开发人员;他们拒绝回答,但很好地指出了 Android NDK 作为首选方法的方向。 (我想交叉编译比从 C 代码转换为 Kotlin 更容易)
如果可能,请使用 Linter、Inspector 和智能语法 AI。

国际象棋 GUI(在本例中为 Droidfish)调用引擎。

问题 1:这不能保证引擎是为您的 ARM7、ARM8、移动硬件等编译的...

问题 2:这也不保证 UCI 功能会起作用,例如 SYZGZY Probe、Opening Book、Novelty bitboard (Scorpio)、winboard、MCTS、Frutility 或其他分析技巧; 以及最重要的 NN-Classic 选项(神经网络位置和类型)。

问题 3:Play 商店规则!您不能预编译 GUI 和引擎。 不确定规则是否阻止使用引擎预编译 EGTB。

你最好的选择;创建 PWA 或 PWA 类似服务,如 Yandex.disk 或 Web2Android;甚至让用户 post 他们的引擎。 编辑 PWA 功能以使用 Lichess API 调用 EGTB、机器人和其他东西。在 PWA 中创建一个下拉列表以下载离线表库、离线 NNUE、培训 FEN、培训 EPD 套件等。

(为什么 LiChess 不做个人机器人,或者托管带有用于 UCI 设置的 cookie 的老式引擎?或者个性机器人? 好吧,他们做“Kindof”;你可以 post 你的机器人,但它们需要由你以某种方式托管......然后就是作弊者)。

主要技术问题的解决方法;您可以使用 Banksai-GUI 和 Lichess BOT API 帐户轻松托管您自己的机器人。然后启动您的 android 平板电脑并向 BOT 挑战游戏。

从技术上讲,您可以随心所欲地托管此机器人;即使在 Docker、GoogleDrive 和 Droidfish 上也有“网络引擎”功能。

我试图在 Fivver 上聘请开发人员为我编译。我没有成功。

如果你成功了;请 post 将您的引擎放在其他人可以使用的地方,例如 GITHUB 和国际象棋引擎论坛。