Classe javacard.framework.service.CardRemoteObject introuvable

Je suis plus récent dans Java Card Platform, donc soyez patient avec moi. J’essaie de développer une application RMI pour la plate-forme Java Card 3. Mon IDE est Eclipse et mon système d’exploitation Windows 10. Je commence par créer une interface simple IContor.java responsable de l’augmentation, de la diminution, etc. de certaines valeurs.

Voici mon interface:

 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; } 

Ensuite, je fournis une implémentation pour cette interface que j’ai nommée 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; } } 

Mon applet de test fonctionnait bien. Ci-dessous j’ai écrit cette paix de code:

 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); } } 

Ceci est un morceau de code standard. Cependant, je veux créer un client qui utilise cette interface qui implémente l’interface Remote . Je crée donc une application Java dans laquelle j’ai copié l’interface IContor.java . Ensuite, j’ai ouvert une invite de commande et fait les choses suivantes:

  • Allez dans le répertoire où se trouvent les fichiers source du premier projet ( cd bla_bla/Contor/src )
  • Allez dans un répertoire ( cd .. )
  • Aller dans le répertoire bin ( cd bin )

Ici, j’ai localisé le nom du paquet ( sid ) et dans le paquet sid j’ai ces trois fichiers ( Contor.class , IContor.class et Test.class ). Ensuite, j’ai tapé la commande suivante à l’invite de commande:

 rmic -v1.2 -classpath .;%JC_CLASSIC_HOME%lib/tools.jar -sid/Contor 

mais j’ai l’erreur suivante:

Classe javacard.framework.service.CardRemoteObject introuvable dans la classe sid.Contor.

Je remplace le tools.jar par api_classic.jar mais j’ai toujours la même erreur. %JC_CLASSIC_HOME% contient le chemin d’access au kit de développement Java Card 3. tools.jar contient des implémentations compilées des packages javacard.framework , javacard.security , javacardx.biometry , javacardx.external et javacardx.framework.tlv . Mon but est de générer une application cliente dans le répertoire bin/sid %JC_CLASSIC_HOME% valeur %JC_CLASSIC_HOME% est C:\Program Files (x86)\Oracle\Java Card Development Kit 3.0.5ga\ et j’utilise JDK 1.8

Voici mon explorateur de paquet d’Eclipse:

entrer la description de l'image ici

Que signifie l’erreur ” Classe javacard.framework.service.CardRemoteObject introuvable dans la classe sid.Contor “?

Cela signifie que vous référencez la classe CardRemoteObject depuis votre classe Contor (car Contor étend CardRemoteObject ). Cependant, le chemin de classe que vous utilisez pour comstackr le stub RMI ne contient pas cette classe.

La classe javacard.framework.service.CardRemoteObject se trouve dans lib/api_classic.jar . Par conséquent, le chemin de classe correct pour l’API Java Card Classic (ce dont vous avez besoin pour générer la classe de stub pour RMI) est lib/api_classic.jar . lib/tools.jar est l’archive Java sur laquelle vous devez comstackr ultérieurement vos applications clientes . lib/tools.jar ne contient que les classes d’exception liées à la Java Card. Cependant, pour comstackr le stub de l’interface distante, vous avez besoin de l’API Java Card complète (au moins les classes référencées à partir de vos classes d’interface).

Comment fonctionne -classpath ?

Le paramètre -classpath est une liste de répertoires et / ou d’archives Java (fichiers .jar) contenant toutes les classes pertinentes pour comstackr un fichier source Java donné (pour javac, le compilateur Java) ou pour comstackr un stub d’interface RMI à partir d’un fichier donné. Fichier de classe Java (pour rmic, le compilateur Java RMI).

Par exemple, le paramètre -classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar" spécifie deux chemins (plusieurs chemins sont séparés par des points-virgules (“;”)):

  1. . spécifie le répertoire en cours (dans votre cas, le répertoire bin).
  2. "%JC_CLASSIC_HOME%/lib/api_classic.jar" spécifie l’archive Java api_classic.jar partir de votre kit de développement Java Card.

Dans ces chemins, les classes sont organisées dans des répertoires mappés aux composants des noms de paquets Java (par exemple, une classe sid.Contor serait située dans un fichier sid/Contor.class ; une classe javacard.framework.service.CardRemoteObject serait située dans un fichier javacard/framework/service/CardRemoteObject.class ).

Comment comstackr le stub RMI?

  1. Accédez à votre répertoire src .
  2. Comstackz les classes Java de l’applet. Dans votre cas, vous pourriez utiliser quelque chose comme:

     javac -classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar" -d ../bin sid/IContor.java sid/Contor.java sid/Test.java 
  3. Accédez à votre répertoire bin : cd ../bin

  4. Comstackz le stub Java RMI. Dans votre cas, vous pourriez utiliser quelque chose comme:

     rmic -v1.2 -classpath .;"%JC_CLASSIC_HOME%/lib/api_classic.jar" sid.Contor 

    La classe doit être spécifiée sans tiret de fin (“-“) et en utilisant des points (“.”) Au lieu de barres obliques (“/”). Si la valeur de la variable d’environnement JC_CLASSIC_HOME contient des espaces, vous devez entourer tout le chemin du fichier api_classic.jar avec des guillemets.