Java 卡转换器: class 不属于包 \
Java Card Converter: class does not belong to package \
我正在创建一个非常简单的 Java 卡片小程序(版本 2.2.2),但我是 java 卡片的新手,我不知道如何转换 .class 文件到 .cap 文件。我正在使用 converter.bat 文件。
我已经设法用 eclipse 将单个 .java 文件编译为 .class...
我尝试将我的小程序移至默认包并从代码顶部删除包...
我尝试用谷歌搜索这个问题,但没有成功...
我尝试使用带有 -target 和 -source 兼容性选项的命令行编译我的代码
我遵循了本教程,但没有成功:https://lavamunky.wordpress.com/2010/03/28/java-card-prog-compile/
当我 运行:
.\converter.bat -applet 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x00 Token -classdir .\Token\ -exportpath %JC_HOME%\api_export_files \ 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00 1.0
它向我抛出一条错误消息:error: class Token does not belong to package \.
我的java小程序:
import javacard.framework.*;
public class Token extends Applet {
/* constants declaration */
// code of CLA byte in the command APDU header
final static byte Amblar_CLA =(byte)0xb0;
// codes of INS byte in the command APDU header
final static byte SET_TOKEN = (byte) 0x30;
final static byte GET_TOKEN = (byte) 0x40;
private short token;
/**
* Installs this applet.
*
* @param bArray
* the array containing installation parameters
* @param bOffset
* the starting offset in bArray
* @param bLength
* the length in bytes of the parameter data in bArray
*/
public static void install(byte[] bArray, short bOffset, byte bLength) {
new Token(bArray, bOffset, bLength);
}
/**
* Only this class's install method should create the applet object.
*/
private Token(byte[] bArray, short bOffset, byte bLength) {
token = 0x00;
register();
}
public boolean select() {
return true;
}
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if ((buffer[ISO7816.OFFSET_CLA] == 0) && (buffer[ISO7816.OFFSET_INS] == (byte)(0xa4)))
return;
if (buffer[ISO7816.OFFSET_CLA] != Amblar_CLA)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buffer[ISO7816.OFFSET_INS]) {
case SET_TOKEN:
setToken(apdu);
break;
case GET_TOKEN:
getToken(apdu);
break;
default: ISOException.throwIt (ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void setToken(APDU apdu) {
byte[] buffer = apdu.getBuffer();
byte byteRead = (byte)(apdu.setIncomingAndReceive());
if (byteRead != 1)
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
byte newToken = buffer[ISO7816.OFFSET_CDATA];
token = (short)newToken;
}
private void getToken(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short le = apdu.setOutgoing();
if ( le < 2 ) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
apdu.setOutgoingLength((byte)2);
buffer[0] = (byte)(token >> 8);
buffer[1] = (byte)(token & 0xff);
apdu.sendBytes((short)0, (short)2);
}
}
您只需要在您的 Java 源文件中放置一个包声明(您总是应该这样做,不要忽略默认包警告)。
例如:
package com.myname.javacard.test;
可以正常工作。
Java 卡片小程序是加载模块的一部分,它基本上由一个普通的 Java 包组成。这个包/加载模块也将被分配 AID(转换器中的十六进制代码)。但是,如果您使用默认包,这是不可能的,如果您没有包声明,则使用默认包。
此外,您必须确保正确找到 class 文件。确保它们位于 文件夹 .\Token
下。可能你应该简单地从 class 目录(它是一个目录,而不是 .class
文件)中删除 \Token
或者完全删除整个 -classdir
。
如果不确定,请在引号或双引号内指定文件夹的完整路径。
我正在创建一个非常简单的 Java 卡片小程序(版本 2.2.2),但我是 java 卡片的新手,我不知道如何转换 .class 文件到 .cap 文件。我正在使用 converter.bat 文件。
我已经设法用 eclipse 将单个 .java 文件编译为 .class...
我尝试将我的小程序移至默认包并从代码顶部删除包...
我尝试用谷歌搜索这个问题,但没有成功...
我尝试使用带有 -target 和 -source 兼容性选项的命令行编译我的代码
我遵循了本教程,但没有成功:https://lavamunky.wordpress.com/2010/03/28/java-card-prog-compile/
当我 运行:
.\converter.bat -applet 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x00 Token -classdir .\Token\ -exportpath %JC_HOME%\api_export_files \ 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00 1.0
它向我抛出一条错误消息:error: class Token does not belong to package \.
我的java小程序:
import javacard.framework.*;
public class Token extends Applet {
/* constants declaration */
// code of CLA byte in the command APDU header
final static byte Amblar_CLA =(byte)0xb0;
// codes of INS byte in the command APDU header
final static byte SET_TOKEN = (byte) 0x30;
final static byte GET_TOKEN = (byte) 0x40;
private short token;
/**
* Installs this applet.
*
* @param bArray
* the array containing installation parameters
* @param bOffset
* the starting offset in bArray
* @param bLength
* the length in bytes of the parameter data in bArray
*/
public static void install(byte[] bArray, short bOffset, byte bLength) {
new Token(bArray, bOffset, bLength);
}
/**
* Only this class's install method should create the applet object.
*/
private Token(byte[] bArray, short bOffset, byte bLength) {
token = 0x00;
register();
}
public boolean select() {
return true;
}
public void process(APDU apdu) {
byte[] buffer = apdu.getBuffer();
if ((buffer[ISO7816.OFFSET_CLA] == 0) && (buffer[ISO7816.OFFSET_INS] == (byte)(0xa4)))
return;
if (buffer[ISO7816.OFFSET_CLA] != Amblar_CLA)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buffer[ISO7816.OFFSET_INS]) {
case SET_TOKEN:
setToken(apdu);
break;
case GET_TOKEN:
getToken(apdu);
break;
default: ISOException.throwIt (ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void setToken(APDU apdu) {
byte[] buffer = apdu.getBuffer();
byte byteRead = (byte)(apdu.setIncomingAndReceive());
if (byteRead != 1)
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
byte newToken = buffer[ISO7816.OFFSET_CDATA];
token = (short)newToken;
}
private void getToken(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short le = apdu.setOutgoing();
if ( le < 2 ) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
apdu.setOutgoingLength((byte)2);
buffer[0] = (byte)(token >> 8);
buffer[1] = (byte)(token & 0xff);
apdu.sendBytes((short)0, (short)2);
}
}
您只需要在您的 Java 源文件中放置一个包声明(您总是应该这样做,不要忽略默认包警告)。
例如:
package com.myname.javacard.test;
可以正常工作。
Java 卡片小程序是加载模块的一部分,它基本上由一个普通的 Java 包组成。这个包/加载模块也将被分配 AID(转换器中的十六进制代码)。但是,如果您使用默认包,这是不可能的,如果您没有包声明,则使用默认包。
此外,您必须确保正确找到 class 文件。确保它们位于 文件夹 .\Token
下。可能你应该简单地从 class 目录(它是一个目录,而不是 .class
文件)中删除 \Token
或者完全删除整个 -classdir
。
如果不确定,请在引号或双引号内指定文件夹的完整路径。