У меня есть модуль С++, который я компилирую как двоичный исполняемый файл для native-messaging или как библиотеку для js-ctypes. Разница между ними состоит в основном в том, что встроенный обмен сообщениями вызывает двоичный исполняемый файл и выполняет обмен данными stdin/stdout, а js-ctypes открывает статическую/общую библиотеку (через dlopen) и вызывает открытые методы вашей библиотеки, которые могут возвращать совместимые типы данных [2] и необязательно вызывать метод обратного вызова JavaScript.