找不到类javacard.framework.service.CardRemoteObject

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 ..)
  • 进入bin目录(cd bin)

这里我找到了package(sid)的名称,并在包中sid我有这三个文件(Contor.class,IContor.classTest.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.externaljavacardx.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:

在此输入图像描述

Mic*_*and 1

错误“在 sid.Contor 类中找不到类 javacard.framework.service.CardRemoteObject。 ”是什么意思?

这意味着您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"指定两个路径(多个路径之间用分号(“;”)分隔):

  1. .指定当前目录(在您的情况下为 bin 目录)。
  2. "%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)。

如何编译 RMI 存根?

  1. 转到您的src目录。
  2. 编译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)
  3. 转到您的bin目录:cd ../bin

  4. 编译 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文件的整个路径用引号引起来。