有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将stockfish集成到Android应用程序中?

我正在研究如何将stockfish(或任何与UCI兼容的引擎)集成到我的Android应用程序中

我从这里下载了stockfish Android zip: Download Stockfish Engine

在zip的Android目录下有两个文件:

  • stockfish-8-arm64-v8a
  • stockfish-8-armeabi-v7a

我有两个问题:

  1. 我是否只需要将这两个文件包含到我的应用程序中(如果需要,我应该将它们放在哪里)?我希望这些是预构建的二进制文件,这样我就不用担心自己编译了
  2. 如何从安卓 Java代码调用这些文件

谢谢


共 (2) 个答案

  1. # 1 楼答案

    StdFISH是用C++编写的,用java编写的一个普通的Android应用程序调用它,你需要

    1. 依靠JNI(Java本机接口,请参见jni-sample)来实现这一点
    2. 在学习了如何使用JNI编译Stockfish之后,您可以通过UCI协议与引擎交互:以下是UCI Specification

    3. 然后,你可以调用特定的方法(例如,评估一个职位,或建议最佳举措)。这一切都从发送引擎开始。如果你得到了答案,你就在正确的轨道上

    修改像Droidfish这样的现有项目比从头开始容易得多

  2. # 2 楼答案

    经过几天的互联网搜索,我找到了一个解决方案:

    • https://stockfishchess.org/download/下载源代码,与平台无关
    • 在Android Studio
    • 中创建一个本地C++项目
    • 可以删除本机库。cpp文件夹中的cpp文件(以及代码中的引用)
    • 提取下载文件的内容,转到src文件夹,将所有文件复制到android项目的cpp文件夹中
    • 在CMakeLists。txt(cpp文件夹)添加:
       add_executable(
                stockfish
        
                benchmark.cpp   evaluate.h ...(and the rest of the copied files)
        )
    
    • 在建造中。externalNativeBuild中的gradle(应用程序)->;cmake add targets "stockfish"像这样:
    externalNativeBuild {
                cmake {
                    targets "stockfish"
                    cppFlags ""
                }
            }
    
    
    • 构建APK
    • 在文件夹/app/中。包含可执行文件的文件夹已生成cxx/cmake/debug
    • 创建一个没有C++支持的新Android项目
    • 在libs文件夹的新项目中,复制上述文件夹(保留名称),并在每个文件夹中删除除stockfish文件以外的所有内容
    • 将每个文件夹中的每个stockfish文件重命名为so lib_stockfish.so,现在文件夹应该如下所示:
    ...
    -libs
         -arm64-v8a
                   -lib_stockfish.so
         -armeabi-v7a
                   -lib_stockfish.so
    and so on...
    ...
    
    • 在建造中。android上的gradle(应用程序)添加:
    sourceSets {
            main {
    
                jniLibs.srcDirs = ['libs']
            }
        }
    
    • 在建造中。gradle(应用程序)在附件中添加:
    implementation fileTree(dir: "libs", include: ["*.jar", "*.so"])
    
    • 在应用程序标记的清单文件中添加:
    android:extractNativeLibs="true"
    
    • 现在只是java中的代码:
    
    String path = getApplicationContext().getApplicationInfo().nativeLibraryDir+"/lib_stockfish.so";
    
    
    File file = new File(path);
    
    try {
        process = Runtime.getRuntime().exec(file.getPath());
    } catch (IOException e) {
        e.printStackTrace();
    }
    
    
    
    Thread outThread =  new Thread(new Runnable() {
        @Override
        public void run() {
    
            Process processOut = process;
            if(processOut == null){
                return;
            }
    
    
               BufferedReader out = new BufferedReader(new InputStreamReader(processOut.getInputStream()));
    
                String data;
                try{
    
    
                       while( (data = out.readLine()) != null ){
    
                        //do something with data
                       }
    
    
                    } catch(IOException e){
                     
                   }
    
                }
            });
    
            outThread.start();
    
    
    ///to give commands
    
    String command = "uci";//or other command
    
    command += "\n";
    
    try {
            Process ep = process;
    
            if (ep != null) {
                ep.getOutputStream().write(command.getBytes());
                ep.getOutputStream().flush();
            }
        } catch (IOException e) {
            
        }