为什么在使用Shareable 接口的情况下小程序转换失败? (在这种情况下如何使用导出文件)

Why applet conversion failed in case of using Shareable interface? (How to use Export files in such cases)

我写了两个名为 MasterAppSlaveApp 的两个 java 卡片小程序,它们位于两个名为 [=94= 的不同包中]masterPack 和 slavePack :

高手辅助:

奴隶援助:

如下所示,我想在我的 SlaveApp[=135] 的 Process() 方法中调用 MasterAppSharedMethod() =]:

硕士课程:

package masterPack;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.Shareable;
import javacard.framework.Util;
public class MasterApp extends Applet implements Shareable {
    // goodNews = "Shared Method Called Successful"
    byte[] goodNews = { (byte) 'S', (byte) 'h', (byte) 'a', (byte) 'r',
            (byte) 'e', (byte) 'd', (byte) ' ', (byte) 'M', (byte) 'e',
            (byte) 't', (byte) 'h', (byte) 'o', (byte) 'd', (byte) ' ',
            (byte) 'C', (byte) 'a', (byte) 'l', (byte) 'l', (byte) 'e',
            (byte) 'd', (byte) ' ', (byte) 'S', (byte) 'u', (byte) 'c',
            (byte) 'c', (byte) 'e', (byte) 's', (byte) 's', (byte) 'f',
            (byte) 'u', (byte) 'l' };

    private MasterApp() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new MasterApp().register();
    }

    public void process(APDU arg0) throws ISOException {
        if (selectingApplet()) {
            return;
        }

    }

    public void SharedMethod(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        Util.arrayCopyNonAtomic(goodNews, (short) 0, buffer, (short) 0,
                (short) goodNews.length);
        apdu.setOutgoingAndSend((short) 0, (short) goodNews.length);
    }

}

从属程序:

package slavePack;

import masterPack.MasterApp;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;

public class SlaveApp extends Applet {

    byte[] masterAppletAID={(byte)0x01,(byte)0x02,(byte)0x03,(byte)0x04,(byte)0x01,(byte)0x01};
    AID aid = JCSystem.lookupAID(masterAppletAID, (short)0, (byte)masterAppletAID.length);
    MasterApp MasterAppInstance = (MasterApp)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);

    private SlaveApp() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new SlaveApp().register();
    }

    public void process(APDU apdu) throws ISOException {
        if(selectingApplet()){
            return;
        }
        MasterAppInstance.SharedMethod(apdu);

    }

}

在第一步中,我成功地将 MasterApp 转换为 .cap 文件,现在我有了它的 .exp 文件在其 .cap 文件的同一目录中。

作为第二步,我想将 SlaveApp 转换为 .cap 文件,但我失败了。估计是需要把之前.exp目录下的SlaveApp文件进行转换,所以把它移到[=94目录下] =]SlaveApp.class 并再次尝试,但没有任何改变,我再次收到以下相同的错误:

问题:

1- 错误的来源是什么?

2- 如何将此 sharedMethod 限制为仅用于一个小程序?我的意思是,在这种情况下所有其他小程序都可以调用它,有什么办法可以限制这种可访问性吗?

3- 如果我们没有 MasterApp.exp 文件,我们必须做什么?

请注意,我感谢任何其他评论,以使我的程序更高效(例如变量类型及其声明点)。


更新:

根据@Paul-Bastin 的回答,我在 MasterApp 包中添加了一个名为 MyShareableInterface 的接口,该接口实现了 Shareable 接口。在此接口中,我声明了我在 MasterApp 中用作接口的相同 SharedMethod 方法。之后,我使用 MasterApp 小程序实现了这个接口。其他的都一样,但没有任何改变。

MyShareableInterface.java :

package masterPack;

import javacard.framework.APDU;
import javacard.framework.Shareable;

public interface MyShareableInterface extends Shareable {
    public void SharedMethod(APDU apdu);

}

MasterApp.java :

public class MasterApp extends Applet implements MyShareableInterface {
//Same Body
}

SlaveApp.java :

和以前一模一样。

问题: 没有任何改变。我有同样的错误。


更新二:

APDU 对象已从所有三个文件中 SharedMethod 的输入参数中删除。它的正文也替换为 ISOException.throwIt((short)0x9100)(在 MasterApp.java 中)。我也有同样的错误。

进行上述更改后,我从头开始重新创建项目,现在我正在处理两个包中的三个 .java 文件,如下所示:

MyShareableInterface.java :

package masterPack;

import javacard.framework.Shareable;

public interface MyShareableInterface extends Shareable{
    public void SharedMthod();
}

MasterApp.java :

package masterPack;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;

public class MasterApp extends Applet implements MyShareableInterface {

    private MasterApp() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new MasterApp().register();
    }

    public void process(APDU arg0) throws ISOException {
        // TODO Auto-generated method stub

    }

    public void SharedMthod() {
        // TODO Auto-generated method stub
        ISOException.throwIt((short)0x9100);

    }

}

SlaveApp.java :

package slavePack;

import masterPack.MasterApp;
import javacard.framework.AID;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.JCSystem;

public class SlaveApp extends Applet {

    byte[] masterAppletAID={(byte)0x01,(byte)0x02,(byte)0x03,(byte)0x04,(byte)0x01,(byte)0x01};
    AID aid = JCSystem.lookupAID(masterAppletAID, (short)0, (byte)masterAppletAID.length);
    MasterApp MasterAppInstance = (MasterApp)JCSystem.getAppletShareableInterfaceObject(aid, (byte)0);

    private SlaveApp() {
    }

    public static void install(byte bArray[], short bOffset, byte bLength)
            throws ISOException {
        new SlaveApp().register();
    }

    public void process(APDU apdu) throws ISOException {
        if(selectingApplet()){
            return;
        }
        MasterAppInstance.SharedMthod();

    }

}

代码没有错误。我什至可以成功地将 MasterApp.java 转换为 .cap 文件。 SlaveApp.java 转换过程失败。这一步我失败了。

请注意:AID-s 与问题的第一个版本相同。前两个文件在 masterPack 中,后者在 slavePack.

  1. 您必须创建一个扩展 Shareable 的接口。
  2. 那么您的小程序必须实现该接口
  3. 您在从属小程序 yb 调用 JCSystem.getAppletShareableInterfaceObject
  4. 中获得此接口
  5. 您通过该对象调用接口的 public 方法
  6. 不要共享 apdu 对象!

强烈推荐陈志群-Java卡片技术书籍