Repository navigation
Expand file tree
/
Copy pathbridge.cpp
More file actions
80 lines (64 loc) · 2.07 KB
/
Copy pathbridge.cpp
File metadata and controls
80 lines (64 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <cstring>
#include <iostream>
#include <jni.h>
#include <sstream>
#include <string>
#include <thread>
#include <unistd.h>
#include <vector>
#include "stockfish/bitboard.h"
#include "stockfish/misc.h"
#include "stockfish/position.h"
#include "stockfish/tune.h"
#include "stockfish/types.h"
#include "stockfish/uci.h"
int input_pipe[2];
int output_pipe[2];
FILE *stockfish_out = nullptr;
FILE *stockfish_in = nullptr;
void stockfish_main() {
using namespace Stockfish;
const int argc = 1;
const char *argv[] = {"stockfish"};
std::cout << engine_info() << std::endl;
Bitboards::init();
Position::init();
UCIEngine uci(argc, const_cast<char **>(argv));
Tune::init(uci.engine_options());
uci.loop();
}
extern "C" JNIEXPORT void JNICALL Java_StockfishEngine_startEngine(JNIEnv *,
jobject) {
pipe(input_pipe); // stdin
pipe(output_pipe); // stdout
dup2(input_pipe[0], STDIN_FILENO); // stdin
dup2(output_pipe[1], STDOUT_FILENO); // stdout
// Wrap pipes in FILE* streams
stockfish_in = fdopen(input_pipe[1], "w"); // We'll write commands to this
stockfish_out = fdopen(output_pipe[0], "r"); // We'll read output from this
std::thread([]() { stockfish_main(); }).detach();
}
extern "C" JNIEXPORT void JNICALL
Java_StockfishEngine_sendCommand(JNIEnv *env, jobject, jstring jcmd) {
const char *cmd = env->GetStringUTFChars(jcmd, nullptr);
if (stockfish_in) {
fprintf(stockfish_in, "%s\n", cmd); // Send command with newline
fflush(stockfish_in); // Important: flush to ensure it's sent
}
env->ReleaseStringUTFChars(jcmd, cmd);
}
// TODO: bad
extern "C" JNIEXPORT jstring JNICALL
Java_StockfishEngine_readOutput(JNIEnv *env, jobject) {
char line[1024];
if (stockfish_out && fgets(line, sizeof(line), stockfish_out)) {
// Strip trailing newline if needed
size_t len = strlen(line);
if (len > 0 && line[len - 1] == '\n') {
line[len - 1] = '\0';
}
return env->NewStringUTF(line);
}
// Nothing to read
return env->NewStringUTF("");
}