我有一个方法将单个字节插入字节缓冲区,在构建和清理Java Card CAP文件期间,它会抛出错误.
码:
private void appendOutputBuffer(byte msg) {
ArrayLogic.arrayCopyRepack(msg, (short) 0, (short) 0, outputBuffer, (short) outputBuffer.length);
}
Run Code Online (Sandbox Code Playgroud)
错误:
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.
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
这不是多么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)
Run Code Online (Sandbox Code Playgroud)
但是src参数意味着是一个数组 - 它Object只是因为Java Card中没有所有原始数组的共同祖先类.并非Java Card中的所有内容都是Object:byte原始的.这会引起你的麻烦.
Java Card构建的第一步是创建标准.class文件的常见Java编译器.该编译器不知道关于Java卡有什么关系,它看到了byte作为Object,所以它使用自动装箱,您铸造byte到java.lang.Byte并添加依赖于java.lang.Byte你的.class文件.到现在为止还挺好.这只是简单的Java,所以它的工作原理.
然而,在Java卡库没有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;
}
Run Code Online (Sandbox Code Playgroud)
并考虑RAM和EEPROM存储两者outputBuffer和effectiveLen.