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

Java Card Local Fixed-Size Array Variable Memory Storage Location

我想知道是否有人知道 temp 数组存储在以下 Java 卡片方法中的确切位置(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中,您可以找到:

The Converter ensures that memory is allocated for the contents of static fields, namely, primitive data types and references to arrays. Memory is allocated for instances by using the new bytecode from the system heap and cannot be reclaimed (unless the smart card implements a garbage collector). Memory for method variables, locals, and parameters is allocated from the stack and is reclaimed when the method returns.

这部分WalletDemoApplet肯定不能生成在局部变量中:

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

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

An array initializer creates an array and provides initial values for all its components.

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


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

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