Extension Java et chrome, messages natifs


J'essaie de faire une extension chrome qui appelle un code java sur mon PC. L'appel fonctionne bien, le code s'exécute, mais j'essaie de renvoyer des variables à l'extension Chrome mais ne fonctionne pas. Je vois dans la console que l'auditeur onDisconect écrit un message de console, mais l'auditeur onMessage ne le fait pas. Je ne connais pas le problème.

Voici mon code dans l'extension Chrome:

JSON manifeste

{
    "name": "Prueba native message",
    "version": "1.0",
    "manifest_version": 2,
    "description": "Chrome extension interacting with Native Messaging and     localhost.",
    "app": {
    "background": {
        "scripts": ["background.js"]
    }
},
    "icons": {
    },
    "permissions": [
        "nativeMessaging"
    ]
}

Contexte.js

var port = chrome.runtime.connectNative('com.app.native');

function message(msg) {
    console.warn("Received" + msg);
}

function disconect() {
    console.warn("Disconnected");
}

console.warn("se ha conectado");

port.onMessage.addListener(message);
port.onDisconnect.addListener(disconect);
port.postMessage({text: "Hello, my_application"});

console.warn("message send");

Et voici mon local fichier.

.chauve-souris

cd C:\Users\pc\IdeaProjects\eDNI\out\production\code && java Main

Principal.java

public class Main {
    public static void main(String argv[]) throws IOException {
        System.out.println("{\"m\":\"hi\"");
    }
}

Dans ce code, j'essaie seulement de renvoyer un message simple à l'extension.

Author: Marcos Pires, 2016-06-29

1 answers

Protocole de messagerie natif

Chrome démarre chaque hôte de messagerie natif dans un processus distinct et communique avec lui en utilisant une entrée standard (stdin) et sortie standard (stdout). Le même format est utilisé pour envoyer messages dans les deux sens: chaque message est sérialisé en utilisant JSON, UTF-8 codé et est précédé d'une longueur de message de 32 bits en natif ordre des octets . La taille maximale d'un seul message du natif l'hôte de messagerie est de 1 Mo, principalement pour protéger Chrome de mauvaise conduite applications natives. La taille maximale du message envoyé au l'hôte de messagerie natif est de 4 Go.

Source: Natif Du Protocole De Messagerie

Les quatre premiers octets doivent être la longueur du message. Vous devez convertir la longueur du message, qui est un entier, en un tableau d'octets:

Option 1: En utilisant java.nio.ByteBuffer classe

public byte[] getBytes(int length) {
    ByteBuffer b = ByteBuffer.allocate(4);
    b.putInt(length);
    return b.array();
}

Option 2: Manuel:

public byte[] getBytes(int length) {
    byte[] bytes = new byte[4];
    bytes[0] = (byte) (length & 0xFF);
    bytes[1] = (byte) ((length >> 8) & 0xFF);
    bytes[2] = (byte) ((length >> 16) & 0xFF);
    bytes[3] = (byte) ((length >> 24) & 0xFF);
    return bytes;
}

Écrire la longueur du message, puis le contenu du message en octets.

String message = "{\"m\":\"hi\"}";
System.out.write(getBytes(message.length())); 
System.out.write(message.getBytes("UTF-8"));
System.out.flush();

Mise à Jour:

Il semble également que vous manquiez le type d'interface qui doit être spécifié dans votre fichier manifeste.

Ajouter ceci: "type": "stdio"

 1
Author: Gideon Pyzer, 2016-06-30 15:33:31