我有一个方法将单个字节插入字节缓冲区,在构建和清理Java Card CAP文件期间,它会抛出错误。
代码:
private void appendOutputBuffer(byte msg) {
ArrayLogic.arrayCopyRepack(msg, (short) 0, (short) 0, outputBuffer, (short) outputBuffer.length);
}
错误:
error: line 163: sctest: class java.lang.Byte not found in export file lang.exp.
error: line 163: sctest: method valueOf(byte) of class java.lang.Byte not found in export file lang.exp or the method signature has changed.
error: line 163: sctest: class java.lang.Byte not found in export file lang.exp.
error: line 163: sctest: class java.lang.Byte in return type of method java.lang.Byte.valueOf(byte) not found.
我该如何解决?
答案 0 :(得分:5)
这不是arrayCopyRepack
的工作原理。阅读文档:http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacardx/framework/util/ArrayLogic.html#arrayCopyRepack%28java.lang.Object,%20short,%20short,%20java.lang.Object,%20short%29
它的签名是:
public static final short arrayCopyRepack(Object src,
short srcOff,
short srcLen,
Object dest,
short destOff)
但是src
参数意味着是一个数组 - 它只是一个Object
,因为Java Card中的所有原始数组都没有共同的祖先类。并非Java Card中的所有内容都是Object
:byte
是原始的。这会引起你的麻烦。
Java Card构建的第一步是创建标准.class
文件的常见Java编译器。此编译器对Java Card一无所知,它看到byte
用作Object
,因此它使用自动装箱,将byte
强制转换为java.lang.Byte
并添加依赖关系java.lang.Byte
文件中的.class
。到现在为止还挺好。这只是普通的Java,所以它可以工作。
但是,在Java Card库中,java.lang.Byte
包中没有java.lang
。这会在创建.cap
文件时导致错误。
将一个字节附加到现有数组(从而创建一个新数组)是一个非常糟糕的主意,顺便说一下。您应该创建buffer
足够长的时间并存储有效长度(缓冲区的已使用部分有多长):
private static final short BUF_LEN = (short) 256;
byte[] outputBuffer = new byte[BUF_LEN];
...
private void appendOutputBuffer(byte msg) {
if (effectiveLen == BUF_LEN)
ISOException.throwIt(ISO7816.SW_UNKNOWN);
outputBuffer[effectiveLen] = msg;
++effectiveLen;
}
并考虑outputBuffer
和effectiveLen
的RAM与EEPROM存储。