Search code examples
androidjava-native-interfacesendmessage

Android send a system message from Java to JNI


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?

flow chart

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.


Solution

  • 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();
            }
        }