Android отправляет системное сообщение с Java в JNI

В моем приложении есть уровень JAVA и JNI.
Можно ли отправить сообщение с уровня Java в пул системных сообщений, а затем получить сообщение на уровне JNI?

блок-схема

По какой-то причине я не могу вызвать метод JNI напрямую из Java, мне нужно найти метод сообщения, такой как WndProc в Windows в Android.


person Sky    schedule 19.03.2015    source источник


Ответы (1)


Вы можете использовать сокеты для связи между Java и JNI. Настройте сервер сокетов в JNI для прослушивания подключения клиента, а затем используйте сокет для подключения к серверу на Java.

Сервер сокетов в 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();
        }
    }
person alijandro    schedule 20.03.2015