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

Elixir/JInterface-将字符串列表从Java发送回Elixir,java,erlang,elixir,otp,jinterface,Java,Erlang,Elixir,Otp,Jinterface,我运行了elixir/otp应用程序。它需要使用一些Java代码,所以我使用JInterface来实现类似RPC的通信 我现在有了这个通讯。我可以从elixir向Java发送消息,并从概念上发回一些数据 我需要发回一个字符串数组 这似乎是一项简单的任务,但我正在努力找到正确的文档来完成这项任务。我能找到的唯一信息只能让我发回一个二进制字符串 下面是我的JInterface代码的重要部分: private static void setupMBox() { try {

我运行了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();
    }
}
private static void setupMBox(){
试一试{
OtpNode myOtpNode=新的OtpNode(“服务器”);
OtpMbox myotmpbox=myOtpNode.createMbox(“ltext”);
myOtpNode.setCookie(“cookiepassword”);
while(true){
OtpErlangTuple tuple=(OtpErlangTuple)myotmpbox.receive();
OtpErlangPid lastPid=(OtpErlangPid)tuple.elementAt(0);
OtpErlangAtom dispatch=(OtpErlangAtom)tuple.elementAt(1);
if(dispatch.toString().equals(“分割段”)){
列出句子=段落拆分器。将段落拆分为句段(测试段落,Locale.JAPAN);
List erlangString=new ArrayList();
for(字符串句子:句子){
add(新的OtpErlangString(句子));
}
//这行不通
OtpErlangList erlangList=new OtpErlangList((OtpErlangObject[])erlangStrings.toArray();
myotmpbox.send(lastPid,erlangList);
System.out.println(erlangList);
}
}
}捕获(例外e){
e、 printStackTrace();
}
}

如果有人这样做了,可以帮助我,我会非常感谢一些指导。提前谢谢

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

有一点建议:


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

好的,所以我在发布这篇文章后不久就让它工作了。从那时起,我做了很多更改,不记得具体的问题是什么-但是,你给了我一些有趣的东西来检查,我没有意识到,我需要测试这个解决方案是否适用于所有情况。特别是,我不知道“UTF-16LE”.我的应用程序是用来学习和批改外语文本的-所以这些东西非常重要。谢谢你的智慧:)