Android 从 Java 向 JNI 发送系统消息
Android send a system message from Java to JNI
我的APP里有一个JAVA和一个JNI层。
是否可以从Java层发送消息到系统消息池,然后在JNI层获取消息?
由于某些原因,我不能直接从Java调用JNI方法,我必须在Android中找到一个像Windows的WndProc这样的消息方法。
您可以使用套接字在 Java 和 JNI 之间进行通信。在JNI中设置一个socket服务器监听客户端连接,然后在Java.
中使用socket连接服务器
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;
}
}
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();
}
}
我的APP里有一个JAVA和一个JNI层。
是否可以从Java层发送消息到系统消息池,然后在JNI层获取消息?
由于某些原因,我不能直接从Java调用JNI方法,我必须在Android中找到一个像Windows的WndProc这样的消息方法。
您可以使用套接字在 Java 和 JNI 之间进行通信。在JNI中设置一个socket服务器监听客户端连接,然后在Java.
中使用socket连接服务器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;
}
}
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();
}
}