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:
cd bla_bla/Contor/src
) cd ..
) 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:
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).
-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 (“;”)):
.
spécifie le répertoire en cours (dans votre cas, le répertoire bin). "%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
).
src
. 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
Accédez à votre répertoire bin
: cd ../bin
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.