【问题标题】:Java Card Local Fixed-Size Array Variable Memory Storage LocationJava 卡本地固定大小数组可变内存存储位置
【发布时间】:2018-12-08 17:36:05
【问题描述】:

我想知道是否有人确切知道temp 数组在以下 Java Card 方法中存储的位置(EEPROM 或 RAM)(我在 JCIDE 示例目录中找到了 WalletDemoApplet 的部分源代码)。请注意,数组不是通过 makeTransientByteArray 分配的。它也被声明为方法内的局部变量。

private void calIntegral(byte [] buf,byte soff,short len)
{
    byte temp[]={0x00,0x00,0x00,0x00};
    short low=0;
    byte aa=0;
    if (len==2)
        Util.arrayCopy(buf, soff, temp,(short)2, len);
    else
        Util.arrayCopy(buf, soff, temp,(short)0, len);

    ...
}

另外,在Java Card Applet Developer's Guide,您可以找到:

转换器确保为静态字段的内容分配内存,即原始数据类型 以及对数组的引用。使用系统堆中的新字节码为实例分配内存 并且不能被回收(除非智能卡实现了垃圾收集器)。方法记忆 变量、局部变量和参数从堆栈中分配,并在方法返回时回收。

【问题讨论】:

  • 在我们发言时,JavaCardOS 的优秀人士正在观看该演示;可能还有其他错误(我发送了 Q/A 的链接)...

标签: smartcard javacard


【解决方案1】:

WalletDemoApplet的这部分肯定不应该在局部变量中生成:

byte temp[]={0x00,0x00,0x00,0x00};

那是EEPROM存储; new byte[] 部分可能被隐藏,但数组创建仍在执行,as specified by the JLS

数组初始化器创建一个数组并为其所有组件提供初始值。

这里的数组初始值设定项是大括号和其中的任何内容。


请至少忽略示例的那一部分。通常,您会为此使用静态方法,并使用带有makeTransientByteArray(在Applet 实例化期间调用)的类字段作为缓冲区。也就是说:如果您需要一个数组,只需定义 4 字节变量或 - 在这种情况下 - 直接设置字节值也可以。

【讨论】:

    【解决方案2】:

    任何数组都将在EEPROM 中创建,而不是在makeTransientByteArray 中创建。您可以在JCIDE 工具中检查可用和消耗的内存。 在此示例中,内存将在EEPROM 中一次又一次地分配,此时将调用此方法。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2011-03-14
      • 2013-12-26
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多