我正在智能手机上的Raspberry Pi
和Android-App
上运行Java程序。应用程序应该能够调用Raspi
上运行的方法。
由于Android
不包含标准Java RMI包,因此我使用了LipeRMI
:http://lipermi.sourceforge.net/
到目前为止,LipeRMI
确实可以很好地传递原始数据类型,例如boolean或int。
我现在要做的是将ArrayList<String>
从服务器传递到应用程序,但每次运行该方法时,都会收到以下错误:
LipeRMIException:Class java.util.ArrayList is not assignable from control.ServerInt
at lipermi.handler.CallHandler.exportObject(CallHandler.java:54)
at lipermi.handler.CallHandler.exportObject(CallHandler.java:48)
at control.RMIServer.createServer(RMIServer.java:26)
at control.Main.main(Main.java:17)
我不明白我在这里做错了什么。
RMIServer.java
public class RMIServer implements ServerInt{
private static final long serialVersionUID = 1L;
private ArrayList<String> list;
public RMIServer() {
list = new ArrayList<String>();
list.add("50:25:5:-1");
list.add("99:42:6:4");
createServer();
}
public void createServer() {
try {
CallHandler callHandler = new CallHandler();
callHandler.registerGlobal(ServerInt.class, this);
callHandler.exportObject(ServerInt.class, list);
Server server = new Server();
server.bind(7777, callHandler);
server.addServerListener(new IServerListener() {
@Override
public void clientDisconnected(Socket socket) {}
@Override
public void clientConnected(Socket socket) {}
});
} catch (LipeRMIException | IOException e) {
e.printStackTrace();
}
}
@Override
public ArrayList<String> getPWMLines() {
return list;
}
}
ServerInt.java
import java.util.ArrayList;
public interface ServerInt{
public ArrayList<String> getPWMLines();
}
答案 0 :(得分:0)
您显然滥用方法CallHandler#exportObject(Class, Object)
,第一个参数必须是表示接口的类,第二个参数必须是实现此接口的类的实例。在这里,您提供ArrayList
作为第二个参数,显然不是ServerInt
的实例,这就是您获得此异常的原因。
以下是如何使用此方法的一个很好的示例:
MyRemoteListener listenerImplementation = new MyRemoteListenerImpl();
callHandler.exportObject(MyRemoteListener.class, listenerImplementation);
在这种情况下,第一个参数是接口MyRemoteListener
,第二个参数是MyRemoteListenerImpl
的实例,它是接口MyRemoteListener
的实现。
要公开List
,您可以尝试callHandler.registerGlobal(List.class, list)