Java卡客户端服务器可共享接口返回6F00

Java卡客户端服务器可共享接口返回6F00,java,applet,smartcard,javacard,Java,Applet,Smartcard,Javacard,我尝试在JavaCard2.2.2中使用Eclipse3.7SDK和可共享接口创建一个简单的客户端和服务器小程序。调用方法JCSystem.getAppletShareableInterfaceObject时,它抛出一个异常,因此返回SW设置为6F00 这是客户端应用程序代码(Test\u Client.java): 这是服务器小程序代码(Test\u Server.java): 以及可共享的接口文件(Test\u ServerInf.java): 您正试图在客户端小程序类的成员字段中存储对可共

我尝试在JavaCard2.2.2中使用Eclipse3.7SDK和可共享接口创建一个简单的客户端和服务器小程序。调用方法
JCSystem.getAppletShareableInterfaceObject
时,它抛出一个异常,因此返回SW设置为6F00

这是客户端应用程序代码(
Test\u Client.java
):

这是服务器小程序代码(
Test\u Server.java
):

以及可共享的接口文件(
Test\u ServerInf.java
):


您正试图在客户端小程序类的成员字段中存储对可共享接口对象的引用:

sio = (Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID, (byte) 0));
其中,
sio
被定义为小程序类实例的私有成员:

public class Test_Client extends Applet {
    private Test_ServerInf sio;
这将导致出现
SecurityException
,因为可共享接口对象归服务器小程序所有(即由不同的上下文)。不允许在实例字段中存储其他上下文拥有的对象

请参阅运行时环境规范Java卡平台版本2.2.2中的访问类实例对象字段(第6.2.8.3节):

字节码:
getfield
putfield

  • […]如果对象由当前活动上下文中的小程序所有,则允许访问
  • 否则,访问将被拒绝

我找到了这个错误的根源。我曾经使用内部开发的应用程序而不是GPShell来加载和安装小程序。当我尝试使用GPShell加载和安装小程序时,问题解决了,一切正常。我不知道该应用程序是如何破坏加载的包的,但它工作正常(经过2周的调试)。

那么
Ins2\u处理程序的
catch
是否捕获到异常?如果是的话,你有没有试着打印出原因?请注意,在线“调试”对我们来说尤其困难,我们甚至不知道如何以及是否实例化了服务器等等。@MaartenBodewes是的,这是一个异常,但它是
RuntimeException
而不是
CardRuntimeException
,因此它不包含任何方法,除了
equals()
。我已经实例化了服务器和客户端。
JCSystem.getAppletShareableInterfaceObject
引发的唯一异常是
SecurityException
。是否尝试删除强制转换?考虑到该位置的官方JC API,我只能看到另一个可能的异常。@MaartenBodewes是的,它再次抛出该异常,但是删除强制转换会导致无法使用接口的内部方法。Vexing。您能否在
Exception
之前单独捕获
SecurityException
?它也没有原因码,所以我们至少知道抛出了哪个异常(是的,我知道,这是唯一应该抛出的异常,但是…)。哦,我已经说过我在下面的答案评论中已经生疏了。幸运的是,您没有:)也有道理,永久存储引用是不允许的。如果另一个小程序被删除了,你会怎么做?它会与GC玩得很开心。考虑到你的注释,我已经更新了上面的源代码,但它会像前面的代码一样抛出异常。@1chenar我没有主意了:-(@1chenar您没有将服务器小程序设置为默认的选定小程序,对吗?您正在基本逻辑通道上进行测试,对吗?@MichaelRoland是的。
package server;

import javacard.framework.Shareable;

public interface Test_ServerInf extends Shareable {

    public short method1();
    public short method2();

}
sio = (Test_ServerInf)(JCSystem.getAppletShareableInterfaceObject(ServerAID, (byte) 0));
public class Test_Client extends Applet {
    private Test_ServerInf sio;