Elixir / JInterface - Отправка списка строк обратно в elixir из Java

У меня запущено приложение elixir / otp. Он должен использовать некоторый код Java, поэтому я использую JInterface для достижения связи, подобной RPC.

У меня сейчас это общение работает. Я могу отправить сообщение из эликсира в Java и концептуально отправить обратно некоторые данные.

Мне нужно отправить обратно массив строк.

Это может показаться простой задачей, но я изо всех сил пытаюсь найти для этого подходящую документацию. Единственная информация, которую я могу найти, действительно помогает мне отправить обратно двоичную строку.

Вот важная часть моего кода JInterface:

    private static void setupMBox() {
    try {
        OtpNode myOtpNode = new OtpNode("server");
        OtpMbox myOtpMbox = myOtpNode.createMbox("ltext");
        myOtpNode.setCookie("cookiepassword");

        while (true) {
            OtpErlangTuple tuple = (OtpErlangTuple) myOtpMbox.receive();
            OtpErlangPid lastPid = (OtpErlangPid) tuple.elementAt(0);
            OtpErlangAtom dispatch = (OtpErlangAtom) tuple.elementAt(1);

            if (dispatch.toString().equals("split_paragraph")) {
                List<String> sentences = paragraphSplitter.splitParagraphIntoSentences(TEST_PARAGRAPH, Locale.JAPAN);
                List<OtpErlangString> erlangStrings = new ArrayList<OtpErlangString>();

                for (String sentence : sentences) {
                    erlangStrings.add(new OtpErlangString(sentence));
                }
                // this will not work
                OtpErlangList erlangList = new OtpErlangList((OtpErlangObject[]) erlangStrings.toArray());

                myOtpMbox.send(lastPid, erlangList);
                System.out.println(erlangList);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Если кто-то сделал это и может мне помочь, я был бы очень признателен за руководство. Заранее спасибо!


person apostrophedottilde    schedule 22.12.2019    source источник


Ответы (1)


Пожалуйста, укажите, что не так с вашим кодом (каков ожидаемый результат и каков фактический результат).

Небольшое предложение:

OtpErlangString фактически соответствует списку символов в Erlang / Elixir, поэтому это может быть не то, что вам нужно, потому что список символов не поддерживает юникод. Вместо этого используйте OtpErlangBinary и не забудьте сопоставить все строки java с байтовыми массивами с помощью javaString.getBytes(StandardCharsets.UTF_8), иначе вы не получите двоичные файлы в кодировке UTF-8 в Erlang / Elixir, потому что java внутренне кодирует каждую строку в UTF-16LE (из-за должны быть совместимы с кодировкой Unicode с фиксированными байтами Windows).

person Aetherus    schedule 23.12.2019
comment
Хорошо, я заработал вскоре после того, как разместил это. С тех пор внесли много изменений и не могу вспомнить, в чем конкретно заключалась проблема - однако вы дали мне проверить некоторые интересные вещи, о которых я не знал, и мне нужно проверить, что это решение работает во всех случаях. В частности, я не знал об UTF-16LE. Мое приложение предназначено для изучения и исправления текста на иностранном языке, поэтому это очень важно. Спасибо за мудрость :) - person apostrophedottilde; 02.01.2020