6 java eclipse windows rmi javacard
我是Java Card Platform的新手,所以请耐心等待我.我正在尝试为Java Card 3平台开发RMI应用程序.我的IDE是Eclipse,我的操作系统是Windows 10.我首先创建一个简单的界面,IContor.java负责增加,减少等某些值.
这是我的界面:
package sid;
import java.rmi.Remote;
import java.rmi.RemoteException;
import javacard.framework.UserException;
public interface IContor extends Remote{
public void Incrementer()throws RemoteException,UserException;
public void Decrementer()throws RemoteException,UserException;
public byte GetValue()throws RemoteException,UserException;
public void Init(byte value)throws RemoteException,UserException;
}
Run Code Online (Sandbox Code Playgroud)
然后我提供了这个接口的实现,我命名为Contor.java:
package sid;
import java.rmi.RemoteException;
import javacard.framework.UserException;
import javacard.framework.service.CardRemoteObject;
public class Contor extends CardRemoteObject implements IContor {
private byte contor = 0;
@Override
public void Incrementer() throws RemoteException, UserException {
++contor;
}
@Override
public void Decrementer() throws RemoteException, UserException {
--contor;
}
@Override
public byte GetValue() throws RemoteException, UserException {
return contor;
}
@Override
public void Init(byte value) throws RemoteException, UserException {
contor = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试小程序工作正常.下面我写了代码的和平:
package sid;
import javacard.framework.*;
import javacard.framework.service.Dispatcher;
import javacard.framework.service.RMIService;
public class Test extends Applet {
Dispatcher dispatcher;
public static void install(byte[] bArray, short bOffset, byte bLength) {
new Test().register();
}
protected Test() {
RMIService rmiService = new RMIService(new Contor());
dispatcher = new Dispatcher((short)1);
dispatcher.addService(rmiService,Dispatcher.PROCESS_COMMAND);
}
@Override
public void process(APDU apdu) {
dispatcher.process(apdu);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一段标准代码.但是我想创建一个使用该接口实现接口的客户端Remote.所以我创建了一个Java应用程序,我在其中复制了该IContor.java接口.然后我打开了一个命令提示符并执行以下操作:
cd bla_bla/Contor/src)cd ..)cd bin)这里我找到了package(sid)的名称,并在包中sid我有这三个文件(Contor.class,IContor.class和Test.class).然后我在命令提示符下键入以下命令:
rmic -v1.2 -classpath .;%JC_CLASSIC_HOME%lib/tools.jar -sid/Contor
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
类sid.Contor中找不到类javacard.framework.service.CardRemoteObject.
我替换了tools.jar,api_classic.jar但我仍然得到相同的错误.它%JC_CLASSIC_HOME%包含Java Card 3开发工具包的路径.tools.jar包含包的编制实施javacard.framework,javacard.security,javacardx.biometry,javacardx.external和javacardx.framework.tlv.我的回合是在bin/sid目录中生成一个客户端应用程序.我的%JC_CLASSIC_HOME%价值是 C:\Program Files (x86)\Oracle\Java Card Development Kit 3.0.5ga\,我正在使用JDK 1.8
这是Eclipse的Package Explorer:
这意味着您CardRemoteObject从类内部引用该类Contor(如Contorextends CardRemoteObject)。但是,用于编译 RMI 存根的类路径不包含此类。
该类javacard.framework.service.CardRemoteObject位于lib/api_classic.jar. 因此,Java Card Classic API 的正确类路径(这是为 RMI 生成存根类所需的路径)是lib/api_classic.jar。是您稍后需要根据其编译客户端应用程序的lib/tools.jarJava 存档。只包含Java Card相关的异常类。然而,为了编译远程接口存根,您需要整个 Java Card API(至少是从接口类引用的那些类)。lib/tools.jar
-classpath运作?该参数-classpath是目录和/或 Java 档案(.jar 文件)的列表,其中包含编译给定 Java 源文件(对于 javac,Java 编译器)或从给定 Java 类编译 RMI 接口存根的所有相关类文件(对于 rmic,Java RMI 编译器)。
例如,参数-classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar"指定两个路径(多个路径之间用分号(“;”)分隔):
.指定当前目录(在您的情况下为 bin 目录)。"%JC_CLASSIC_HOME%/lib/api_classic.jar"api_classic.jar指定Java 卡开发工具包中的Java 存档。在这些路径中,类被组织在映射到 Java 包名称的组件的目录中(例如,类sid.Contor将位于文件中sid/Contor.class;类javacard.framework.service.CardRemoteObject将位于文件中javacard/framework/service/CardRemoteObject.class)。
src目录。编译applet 的Java 类。在你的情况下,你可以使用类似的东西:
javac -classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar" -d ../bin sid/IContor.java sid/Contor.java sid/Test.java
Run Code Online (Sandbox Code Playgroud)转到您的bin目录:cd ../bin
编译 Java RMI 存根。在你的情况下,你可以使用类似的东西:
rmic -v1.2 -classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar" sid.Contor
Run Code Online (Sandbox Code Playgroud)
指定类时必须不带尾部破折号(“-”),并使用点(“.”)而不是斜杠(“/”)。如果环境变量的值JC_CLASSIC_HOME包含空格,则需要将api_classic.jar文件的整个路径用引号引起来。
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |