Java卡导出文件依赖项

时间:2017-07-29 15:17:53

标签: java compilation dependencies applet javacard

我在三个独立的包中写了三个小程序

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

0 个答案:

没有答案