1

내 PC에서 Java 코드를 호출하는 크롬 확장을 시도합니다. 호출이 제대로 작동하지만 코드가 실행되지만 크롬 확장에 변수를 반환하려고 시도하지만 작동하지 않습니다. 콘솔에서 수신기가 onDisconect 콘솔 메시지를 쓰지만 수신기는 onMessage이 아닙니다. 나는 그 문제를 모른다.Java 및 크롬 확장, 기본 메시지

매니페스트 JSON

{ 
    "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" 
    ] 
} 

background.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"); 

그리고 여기 내 로컬 파일 :

다음은 크롬 확장에 내 코드입니다.

이 코드에서 Main.java

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

.bat 인

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

난 단지 확장에 간단한 메시지를 반환하려고합니다.

답변

1

기본 메시지 프로토콜

크롬 별도의 프로세스에서 각 기본 메시지 호스트 시작하고 표준 입력 (표준 입력)와 표준 출력 (표준 출력)를 이용하여 통신한다. 각 메시지는 메시지를 양방향으로 전송하는 데 사용됩니다. 각 메시지는 UTF-8로 인코딩되고 으로 인코딩되며 네이티브 바이트 순서의 32 비트 메시지 길이가 앞에옵니다. 기본 메시징 호스트의 단일 메시지의 최대 크기는 1MB이며 주로 Chrome이 오작동으로 인해 기본 응용 프로그램을 보호합니다. 기본 메시지 호스트로 보낸 메시지의 최대 크기는 4GB입니다.

자료 :Native Messaging Protocol

첫 번째 4 바이트는 메시지의 길이를해야합니다.

옵션 1 : 당신은 바이트 배열로 정수 메시지 길이를 변환 할 필요가가 사용 java.nio.ByteBuffer 클래스

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

옵션 2 : 수동 :

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; 
} 

메시지 길이와 메시지 내용을 바이트로 씁니다.

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

업데이트 : 당신이 당신의 매니페스트 파일에 지정해야하는 인터페이스 유형을 누락처럼도 보이는

.

이 추가 : chrome.runtime.sendNativeMessage ('com.app을 :

+0

"type": "stdio" 나는 내가의 .js를 변경하려고하고 지금처럼, 콘솔이 같은 말한다,이, 아무것도 시도하지 않습니다. native ', {text : "Hello"}, 함수 (응답) { console.log ("수신"+ 응답), }); 콘솔의 메시지가 "수신되지 않았습니다" –

+0

@MarcosPires 내 대답의 업데이트를 참조하십시오. 매니페스트에 인터페이스 유형'stdio'가 없습니다. 'stdout'와 같은'System.out'을 사용하고 있습니다. –

+0

@Peter 로컬 파일의 매니페스트에'type'을 넣으려는 경우, 형식이 있습니다. '{ "name": "com.app.native", "description": " 귀하의 desctiption ", "경로 ":"C :/사용자/PC/데스크탑/네이티브 메시지/native_app/prueba.bat " "유형 ":"stdio ", "allowed_origins ": [ \t"chrome-extension : // dmclpldhhlhdmkmikdmgpcjpcnpikgpp/" " } 이전에는 포함되지 않으셔서 죄송합니다. 나는'System.out'으로 당신을 이해하지 못합니다. 그렇지 않습니까? –