There are a JAVA and a JNI layer in my APP.
Is it possible to send a message from the Java layer to the system message pool, and then get the message in the JNI layer?
For some reason, I cannot call a JNI method from Java directly, I have to find out a message method like WndProc of Windows in Android.
You can use sockets to communicate between Java and JNI. Setup the a socket server in JNI to listen the client to connect, then, then use socket to connect to the server in Java.
Socket server in JNI.
struct sockaddr_in serv_addr;
int sockfd, connfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(6666);
bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(sockfd, 10);
while (1) {
connfd = accept(sockfd, (struct sockaddr*)NULL, NULL);
time_t result;
time(&result);
cout << "connecting from java " << ctime(&result);
char buffer[1024] = { 0 };
read(connfd, buffer, sizeof(buffer)/sizeof(char));
cout << "receive command... " << buffer << endl;
close(connfd);
if (strcmp(buffer, "END") == 0) {
cout << "socket thread terminate" << endl;
break;
}
}
Socket client in Java
for (int i = 0; i < 3; i++) {
try {
Socket socket = new Socket(Inet4Address.getByName("localhost"), 6666);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
switch (i) {
case 0:
writer.write("ADD");
break;
case 1:
writer.write("SUB");
break;
case 2:
writer.write("END");
break;
default:
break;
}
Thread.sleep(2000);
writer.flush();
socket.close();
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}