<div dir="ltr"><div>The Javadoc of OtpMsg.type() is what you're looking for.<br><br>The Java node is receiving a notification of the process link.  This message type has no "payload", so getMsg() fails with NPE.  Before calling getMsg(), check the message type with msg.type().<br>
<br></div>-Garret Smith<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Mar 15, 2013 at 11:15 PM, J David Eisenberg <span dir="ltr"><<a href="mailto:jdavid.eisenberg@gmail.com" target="_blank">jdavid.eisenberg@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have written a test program that connects Erlang and Java as follows:<br>
1) Erlang module spawns a Java program via open_port/2.<br>
2) Erlang then uses the port to send Java the Erlang node name.<br>
3) The Java program uses that information to open a connection to Erlang.<br>
4) Java sends back the pid of the Java program, then awaits a message<br>
from Erlang<br>
5) Erlang sends back an acknowledgment to Java, and...<br>
6) Java sends back a final message to Erlang.<br>
<br>
Here is the Java code with debugging output in Test.java<br>
//==========================<br>
import com.ericsson.otp.erlang.*;<br>
import java.io.BufferedInputStream;<br>
import java.io.BufferedReader;<br>
import java.io.InputStreamReader;<br>
<br>
public class Test<br>
{<br>
  public static void main(String[] args)<br>
  {<br>
    OtpSelf self;<br>
    OtpConnection connection;<br>
    OtpPeer erlangPeer;<br>
    OtpErlangObject [] elements = new OtpErlangObject[2];<br>
    OtpMsg message;<br>
    OtpErlangObject obj;<br>
    OtpErlangTuple tuple;<br>
    OtpErlangPid erlangPid;<br>
    String erlangAtom;<br>
<br>
    try<br>
    {<br>
      self = new OtpSelf("java");<br>
      BufferedReader input = new BufferedReader(new InputStreamReader(<br>
        System.in));<br>
      String erlNodeName = input.readLine();<br>
      System.err.println("Erlang node is |" + erlNodeName + "|\r");<br>
<br>
      erlangPeer = new OtpPeer(erlNodeName);<br>
<br>
      connection = self.connect(erlangPeer);<br>
      System.err.println("Connection to " + erlangPeer + " " +<br>
connection + "\r");<br>
<br>
      elements[0] = new OtpErlangAtom("sent_from_java");<br>
      elements[1] = connection.self().pid();<br>
      connection.send("testing", new OtpErlangTuple(elements));<br>
<br>
      message = connection.receiveMsg();<br>
      System.err.println("Java received message " + message + "\r");<br>
      obj = message.getMsg();<br>
      tuple = (OtpErlangTuple) obj;<br>
      erlangAtom = ((OtpErlangAtom) tuple.elementAt(0)).atomValue();<br>
      erlangPid = (OtpErlangPid) tuple.elementAt(1);<br>
      System.err.println("Java received " + erlangAtom + " " +<br>
erlangPid + "\r");<br>
<br>
      connection.send("testing", new OtpErlangAtom("goodbye"));<br>
    }<br>
    catch (Exception e)<br>
    {<br>
      System.err.println("Java gets exception" + "\r");<br>
      e.printStackTrace(System.err);<br>
    }<br>
  }<br>
}<br>
//===========================<br>
<br>
And here is the Erlang module, test.erl:<br>
%=====================<br>
-module(test).<br>
-export([go/0,test/0]).<br>
<br>
go() -><br>
  Pid = spawn(?MODULE, test, []),<br>
  register(testing, Pid),<br>
  io:format("Erlang spawns test process with pid ~p~n", [Pid]),<br>
  process_flag(trap_exit, true),<br>
  Port = open_port({spawn, "java -cp<br>
.:/usr/lib/erlang/lib/jinterface-1.5.6/priv/OtpErlang.jar:core.jar<br>
Test"},<br>
    [{line, 256}]),<br>
<br>
  % send my node name to the Java program.<br>
  port_command(Port, list_to_binary(atom_to_list(node()) ++ "\n" )),<br>
  test().<br>
<br>
test() -><br>
  receive<br>
    % get the pid of the Java process<br>
    {Atom, Pid} -><br>
      io:format("Erlang receives: ~p ~p~n", [Atom, Pid]),<br>
<br>
      %%% link(Pid), % let me know if Java crashes..<br>
<br>
      Pid ! {sent_from_erlang, self()}, % and send it a message<br>
      test(); % then wait for another message<br>
    Other -><br>
      io:format("Erlang receives ~p~n", [Other])<br>
   end.<br>
%======================<br>
<br>
This all works great until I uncomment the ilne with the %%%<br>
link(Pid). If I do that, then, when I send the message to Java, it<br>
says:<br>
<br>
java.lang.NullPointerException<br>
at com.ericsson.otp.erlang.OtpMsg.getMsg(OtpMsg.java:212)<br>
at Test.main(Test.java:39)<br>
<br>
If I link to the Port instead of the Pid, everything works. I'm<br>
clearly overlooking some simple concept; what is it?<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div>