Elixir / JInterface - 从 Java 将字符串列表发送回 elixir

Posted

技术标签:

【中文标题】Elixir / JInterface - 从 Java 将字符串列表发送回 elixir【英文标题】:Elixir / JInterface - Sending a list of strings back to elixir from Java 【发布时间】:2020-04-13 21:18:32 【问题描述】:

我正在运行 elixir/otp 应用程序。它需要使用一些Java代码,所以我使用JInterface来实现类似RPC的通信。

我现在可以进行这种通信了。我可以从 elixir 向 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();
    

如果有人这样做并且可以帮助我,我将非常感谢一些指导。提前致谢!

【问题讨论】:

【参考方案1】:

请说明您的代码有什么问题(预期结果是什么,实际结果是什么)。

一点建议:

OtpErlangString 实际上映射到 Erlang/Elixir 中的 charlist,所以这可能不是你想要的,因为 charlist 不支持 unicode。请改用OtpErlangBinary,不要忘记使用javaString.getBytes(StandardCharsets.UTF_8) 将所有java 字符串映射到字节数组中,否则您将无法在Erlang/Elixir 中获得UTF-8 编码的二进制文件,因为java 在内部对UTF-16LE 中的每个字符串进行编码(由于需要兼容Windows的固定字节unicode编码)。

【讨论】:

好的,所以我在发布后不久就开始工作了。从那时起已经进行了许多更改,并且不记得具体是什么问题 - 但是,您给了我一些有趣的事情来检查我不知道的事情,我需要测试这个解决方案是否适用于所有情况。特别是,我不知道“UTF-16LE”。我的应用程序用于学习和纠正外语文本 - 所以这些东西非常重要。谢谢你的智慧:)

以上是关于Elixir / JInterface - 从 Java 将字符串列表发送回 elixir的主要内容,如果未能解决你的问题,请参考以下文章

将来自 JInterface Java 应用程序的二进制响应转换回 Elixir 中的字符串列表

通过 Jinterface 调用 gen_server?

Elixir:根据索引从列表中选择多个元素

Elixir - 从命令行运行时记录器输出是彩色的,从 iex 运行时不是这样

Elixir/Phoenix 日期从工作日 + 周数

如何从 Erlang/Elixir 中的 ets 集中选择一个随机元素?