Java卡本地固定大小的数组可变内存存储位置

时间:2018-12-08 17:36:05

标签: smartcard javacard

我想知道是否有人知道下面的Java Card方法(我在JCIDE示例目录中找到的WalletDemoApplet的源代码的一部分)中的temp数组的存储位置(EEPROM或RAM)。请注意,该数组不是通过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中,您可以找到:

  

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

1 个答案:

答案 0 :(得分:4)

WalletDemoApplet的这一部分当然不应在局部变量中生成:

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

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

  

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

这里数组初始化器是花括号和其中的所有内容。


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