Java “如何发送”;安装";使用“";过程“;方法?
我为java卡编写了一个小程序,我想将Java “如何发送”;安装";使用“";过程“;方法?,java,javacard,Java,Javacard,我为java卡编写了一个小程序,我想将install方法的参数发送到CAD。因此,我在applet中定义了两个名为array和arrayLength的静态变量。之后,我在该方法的主体中复制了install方法参数。最后,我尝试使用过程方法将这些变量返回给CAD。但是在SELECT命令的响应中,卡返回SW=6F00 package bArrayAccessibilty; import javacard.framework.APDU; import javacard.framework.Apple
install
方法的参数发送到CAD。因此,我在applet中定义了两个名为array和arrayLength的静态变量。之后,我在该方法的主体中复制了install
方法参数。最后,我尝试使用过程方法将这些变量返回给CAD。但是在SELECT
命令的响应中,卡返回SW=6F00
package bArrayAccessibilty;
import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISOException;
import javacard.framework.Util;
public class BArrayReturner extends Applet {
public static byte[] theArray;
public static short arrayLength;
private BArrayReturner() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new BArrayReturner().register();
BArrayReturner.arrayLength=(short)bArray.length;
Util.arrayCopyNonAtomic(bArray, (short)0,BArrayReturner.theArray , (short) 0, BArrayReturner.arrayLength);
}
public void process(APDU apdu) throws ISOException {
byte[] buffer=apdu.getBuffer();
Util.arrayCopyNonAtomic(BArrayReturner.theArray, (short)0,buffer , (short) 0, BArrayReturner.arrayLength);
apdu.setOutgoingAndSend((short)0, (short)255);
}
请注意,静态字段的初始化不会改变任何内容。
我是说,我在班里也试过这样的台词:
public static byte[] theArray=null;
public static short arrayLength=0;
但一切都没有改变
我的程序出了什么问题?安装te小程序时会调用安装方法。
当您(选择first并)向实例化/安装的小程序发送命令时,将调用process方法。
这意味着安装方法将首先被调用,因此:
第一个错误是要写入未初始化数组的tat(数组==null)
您的第二个错误是Util.arrayCopyNonAtomic的参数错误(注意安装方法移交的offsetParameter)谢谢亲爱的Paul。它有什么解决方案吗?在初始化字节数组之前,请阅读Util.arrayCopyNonAtomic()的JC规范。我用{(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,…}
初始化了静态字段数组,我的问题就解决了。谢谢:)但我不明白这是为什么。为什么我们必须初始化字节数组?据我所知,静态字段在声明时自动初始化为0x00
。字节数组只是一个指针,如果不初始化数组,它就不会指向任何地方。您还可以使用数组=新字节[长度]
进行初始化。声明只声明具有变量名的对象,默认情况下,short等simpe对象可能会初始化,但字节数组指针不会初始化(因为编译器无法猜到数组长度,例如),这是否仅适用于java卡,在方法中使用静态变量之前,我需要初始化静态变量(原因是源代码限制。即,我必须在安装时分配内存,以防止运行时出错)?或者在java程序中我也必须这样做?