我在三个独立的包中写了三个小程序
packageA中的ServerApp
packageB中的ClientApp
CharlieApp in packageC
我的目标是查看CharlieApp是否可以通过ClientApp访问grantCredit方法。
我能够将ServerApp和ClientApp转换为上限文件并加载到Java Card 2.2.0并访问grantCredit方法。
packageA 还包含一个名称 MSI 扩展可共享的界面。我能够为packageA和packageB生成上限文件,将它们加载到卡中,并能够从ClientApp访问 grantCredit 方法。但我无法在 packageB.exp 文件中包含 packageB.ClientApp ,因此在将CharlieApp转换为上限文件时出现错误
当我尝试转换CharlieApp时,会显示以下错误
[cap] error: line 89: packageC.CharlieApp: class packageB.ClientApp not found in export file packageB.exp.
我有一个提示,如果你的CAP文件中有applet,你的导出将不包含公共类。但是,我需要一种方法将ClientApp包含在packageB.exp中。
以下是Serverapp的重要代码
package packageA;
import javacard.framework.*;
public class ServerApp extends Applet implements MSI{
private static short miles;
public ServerApp(){
register();
miles = (short) 0;
}
public Shareable getShareableInterfaceObject(AID client, byte param){
if(client.equals(ClientAID, (short)0, (byte) ClientAID.length) == false)
return null;
return this;
}
public void grantcredit(short amount){
miles = (short)(miles + amount);
}
}
以下是ClientApp的重要部分
package packageB;
import packageA.ServerApp;
import packageA.MSI;
import javacard.framework.*;
public class ClientApp extends Applet {
public static MSI ServerObject;
public void process(APDU apdu) throws ISOException {
...
if (apduBuffer[ISO7816.OFFSET_CLA] == CLA_SIMPLEAPPLET) {
switch (apduBuffer[ISO7816.OFFSET_INS] )
{
case INS_USERINPUT1:
foo(apdu);
break;
default :
ISOException.throwIt( ISO7816.SW_INS_NOT_SUPPORTED ) ;
break ;
}
}
else ISOException.throwIt( ISO7816.SW_CLA_NOT_SUPPORTED);
}
public void foo(APDU apdu){
byte[] apdubuf = apdu.getBuffer();
...
AID aid = JCSystem.lookupAID(ServerAID, (short)0, (byte)ServerAID.length);
ServerObject = (MSI) JCSystem.getAppletShareableInterfaceObject(aid, (byte) 0);
ServerObject.grantcredit(amount);
...
apdu.setOutgoing();
...
}
}
和CharlieApp
package packageC;
import packageA.MSI;
import packageB.ClientApp;
import javacard.framework.*;
public class CharlieApp extends Applet {
private static MSI ServerObject;
public void process(APDU apdu) throws ISOException {
...
if (apduBuffer[ISO7816.OFFSET_CLA] == CLA_SIMPLEAPPLET) {
switch (apduBuffer[ISO7816.OFFSET_INS] )
{
case INS_USERINPUT1:
foo(apdu);
break;
default :
ISOException.throwIt( ISO7816.SW_INS_NOT_SUPPORTED ) ;
break ;
}
}
else ISOException.throwIt( ISO7816.SW_CLA_NOT_SUPPORTED);
}
public void foo(APDU apdu){
byte[] apdubuf = apdu.getBuffer();
ServerObject = ClientApp.ServerObject;
ServerObject.grantcredit(amount);
apdu.setOutgoing();
}
}