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.
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"