为什么在使用Shareable 接口的情况下小程序转换失败? (在这种情况下如何使用导出文件)
Why applet conversion failed in case of using Shareable interface? (How to use Export files in such cases)
我写了两个名为 MasterApp 和 SlaveApp 的两个 java 卡片小程序,它们位于两个名为 [=94= 的不同包中]masterPack 和 slavePack :
高手辅助:
- 包裹:
01 02 03 04 01
- 小程序:
01 02 03 04 01 01
奴隶援助:
- 包裹:
01 02 03 04 02
- 小程序:
01 02 03 04 02 02
如下所示,我想在我的 SlaveApp[=135] 的 Process()
方法中调用 MasterApp 的 SharedMethod()
=]:
硕士课程:
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
.
中
- 您必须创建一个扩展 Shareable 的接口。
- 那么您的小程序必须实现该接口
- 您在从属小程序 yb 调用
JCSystem.getAppletShareableInterfaceObject
中获得此接口
- 您通过该对象调用接口的 public 方法
- 不要共享 apdu 对象!
强烈推荐陈志群-Java卡片技术书籍
我写了两个名为 MasterApp 和 SlaveApp 的两个 java 卡片小程序,它们位于两个名为 [=94= 的不同包中]masterPack 和 slavePack :
高手辅助:
- 包裹:
01 02 03 04 01
- 小程序:
01 02 03 04 01 01
奴隶援助:
- 包裹:
01 02 03 04 02
- 小程序:
01 02 03 04 02 02
如下所示,我想在我的 SlaveApp[=135] 的 Process()
方法中调用 MasterApp 的 SharedMethod()
=]:
硕士课程:
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
.
- 您必须创建一个扩展 Shareable 的接口。
- 那么您的小程序必须实现该接口
- 您在从属小程序 yb 调用
JCSystem.getAppletShareableInterfaceObject
中获得此接口
- 您通过该对象调用接口的 public 方法
- 不要共享 apdu 对象!
强烈推荐陈志群-Java卡片技术书籍