经过多天的互联网搜索,我找到了一个解决方案:
- 从 https://stockfishchess.org/download/ 下载源代码,平台无关紧要
- 在安卓工作室中创建原生C++项目
- 您可以删除 cpp 文件夹中的 native-lib.cpp 文件(以及代码中的引用)
- 提取下载文件的内容,转到src文件夹,将所有文件复制到Android项目的cpp文件夹中
- 在 CMakeLists.txt(cpp 文件夹)中添加:
add_executable(
stockfish
benchmark.cpp evaluate.h ...(and the rest of the copied files)
)
- 在 externalNativeBuild->cmake 中的 build.gradle(app) 中,添加如下内容:
targets "stockfish"
externalNativeBuild {
cmake {
targets "stockfish"
cppFlags ""
}
}
- 构建 APK
- 在文件夹 /app/.cxx/cmake/debug 中,已生成包含可执行文件的文件夹
- 创建一个没有c ++支持的新Android项目
- 在新项目中的libs文件夹中复制上面提到的文件夹(保留名称),并在每个文件夹中删除除stockfish文件之外的所有内容。
- 重命名每个文件夹中的每个stockfish文件,如下所示,现在文件夹应如下所示:
lib_stockfish.so
...
-libs
-arm64-v8a
-lib_stockfish.so
-armeabi-v7a
-lib_stockfish.so
and so on...
...
- 在 android 的 build.gradle(app) 中添加:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- 在 build.gradle(app) 中的依赖项中添加:
implementation fileTree(dir: "libs", include: ["*.jar", "*.so"])
android:extractNativeLibs="true"
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) {
}