当前位置: 首页 > 知识库问答 >
问题:

如何使用Commandline生成java CAP文件

萧安怡
2023-03-14

我试图为符合Java Card 2.2.1平台的智能卡生成以下程序的CAP文件:

package helloWorldPackage;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.ISO7816;
import javacard.framework.ISOException;
import javacard.framework.Util;

public class HelloWorldApplet extends Applet 
{
    private static final byte[] helloWorld = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o',(byte)' ',(byte)'W',(byte)'o',(byte)'r',(byte)'l',(byte)'d',};
    private static final byte HW_CLA = (byte)0x80;
    private static final byte HW_INS = (byte)0x00;

    public static void install(byte[] bArray, short bOffset, byte bLength) 
        {
        new HelloWorldApplet().register(bArray, (short) (bOffset + 1), bArray[bOffset]);
        }

    public void process(APDU apdu) 
        {
        if (selectingApplet()) 
            {
            return;
            }

        byte[] buffer = apdu.getBuffer();
        byte CLA = (byte) (buffer[ISO7816.OFFSET_CLA] & 0xFF);
        byte INS = (byte) (buffer[ISO7816.OFFSET_INS] & 0xFF);

        if (CLA != HW_CLA)
            {
            ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
            }

        switch ( INS ) 
            {
            case HW_INS:
                getHelloWorld( apdu );
                break;
            default:
                ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
            }
        }

    private void getHelloWorld( APDU apdu)
        {
        byte[] buffer = apdu.getBuffer();
        short length = (short) helloWorld.length;
        Util.arrayCopyNonAtomic(helloWorld, (short)0, buffer, (short)0, (short) length);
        apdu.setOutgoingAndSend((short)0, length);
        }
}

因此,我将其保存在.java名为HelloWorldApplet.java文件中,然后将其编译为.class文件,如下所示:

E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin>javac -g -source 1.2 -target 1.2 -cp "E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_
1-win-dom\lib\api.jar" "E:\ToCompile\HelloWorldApplet.java"
warning: [options] bootstrap class path not set in conjunction with -source 1.2
1 warning

问题1:这个警告是为了什么?

之后,我尝试将这个.class文件转换为其.cap形式:

E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin>converter -debug -verbose -classdir E:\ToCompile helloWorldPackage 0xa0:0x0:0x0:0x0:0x6
2:0x3:0x1:0xc:0x6:0x1 1.0
error: input class directory E:\ToCompile\helloWorldPackage not found.
Usage:  converter  <options>  package_name  package_aid  major_version.minor_version
OR
converter -config <filename>
                    use file for all options and parameters to converter
Where options include:
        -classdir <the root directory of the class hierarchy>
                      set the root directory where the Converter
                      will look for classes
        -i            support the 32-bit integer type
        -exportpath  <list of directories>
                      list the root directories where the Converter
                      will look for export files
        -exportmap    use the token mapping from the pre-defined export
                      file of the package being converted. The converter
                      will look for the export file in the exportpath
        -applet <AID class_name>
                      set the applet AID and the class that defines the
                      install method for the applet
        -d <the root directory for output>
        -out  [CAP] [EXP] [JCA]
                      tell the Converter to output the CAP file,
                      and/or the JCA file, and/or the export file
        -V, -version  print the Converter version string
        -v, -verbose  enable verbose output
        -help         print out this message
        -nowarn       instruct the Converter to not report warning messages
        -mask         indicate this package is for mask, so restrictions on
                      native methods are relaxed
        -debug        enable generation of debugging information
        -nobanner     suppress all standard output messages
        -noverify     turn off verification. Verification is default

为什么转换器要寻找这个路径?我指定e:\tocompile目录作为类目录,但它将我指定的路径与我的程序包名连接起来!为什么?

Q3:当我们使用Winrar打开.cap文件时,我们可以在header.cap和Applet.cap文件中找到包帮助和Applet帮助。在上面的步骤中,我只指定了我的包帮助,那么它如何在cap文件中分配Applet帮助呢?

更新:(Thanx对Bodewes先生的回答)

我将helloworldapplet.java及其生成的类文件(即helloworldapplet.class)移动到同一目录中名为helloWorldPackage(我的Applet包名)的文件夹中。然后重试convert命令:

E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin>converter -debug -verbose -classdir E:\ToCompile\ helloWorldPackage 0xa0:0x0:0x0:0x0:0x
62:0x3:0x1:0xc:0x6:0x1 1.0

Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

parsing E:\ToCompile\helloWorldPackage\HelloWorldApplet.class
converting helloWorldPackage.HelloWorldApplet
error: export file framework.exp of package javacard.framework not found.

conversion completed with 1 errors and 0 warnings.

由于出现错误,我将-exportpath参数添加到命令中,然后重试:

E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin>converter -debug -verbose -exportpath E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_
1-win-dom\api_export_files -classdir E:\ToCompile\ helloWorldPackage 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 1.0

Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

parsing E:\ToCompile\helloWorldPackage\HelloWorldApplet.class
converting helloWorldPackage.HelloWorldApplet
parsing E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\api_export_files\javacard\framework\javacard\framework.exp
parsing E:\ToCompile\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\api_export_files\java\lang\javacard\lang.exp
writing E:\ToCompile\helloWorldPackage\javacard\helloWorldPackage.exp
writing E:\ToCompile\helloWorldPackage\javacard\helloWorldPackage.jca
error:  Static array initialization in class helloWorldPackage/HelloWorldApplet in library package not allowed.

Cap file generation failed.

conversion completed with 1 errors and 0 warnings.

经过一番努力,我终于发现,转换器有一个名为Applet的参数,如果我不在命令行中使用它(以-Applet appleTClassName 的形式),那么转换器将该包视为库包(其内容中没有Applet AID),但是如果我像下面这样将该参数添加到命令行中,转换器将该包视为Applet包,并使用我添加到参数中的AID来分配cap文件中header.cap(或者Applet.cap)中的AID。(我的问题3的答案):

C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin>converter -debug -verbose -exportpath C:\Users\AmirEbrahim\Desktop\JC_C
onverter\JCDK\java_card_kit-2_2_1-win-dom\bin  -classdir C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin -applet 0xa0:0
x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1:0x2 HelloWorldApplet helloWorldPackage 0xa0:0x0:0x0:0x0:0x62:0x3:0x1:0xc:0x6:0x1 1.0

Java Card 2.2.2 Class File Converter, Version 1.3
Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms.

parsing C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin\helloWorldPackage\HelloWorldApplet.class
converting helloWorldPackage.HelloWorldApplet
parsing C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin\javacard\framework\javacard\framework.exp
parsing C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin\java\lang\javacard\lang.exp
writing C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin\helloWorldPackage\javacard\helloWorldPackage.exp
writing C:\Users\AmirEbrahim\Desktop\JC_Converter\JCDK\java_card_kit-2_2_1-win-dom\bin\helloWorldPackage\javacard\helloWorldPackage.jca

conversion completed with 0 errors and 0 warnings.

共有1个答案

井宪
2023-03-14

警告:[options]引导类路径没有与-source 1.2一起设置

这个警告是为了什么?

出现警告是因为您正在编译1.2源代码,以便与更新的引导类路径(即当前JRE的类路径)兼容。现在,如果您在JRE中使用较新的类,那么您将不兼容Java1.2。如果您的所有类都像您应该的那样只使用Java Card类,那么这当然不是问题。换句话说,你可以放心地忽略它。

Q3:当我们使用Winrar打开一个.cap文件时,我们可以在header.capApplet.cap文件中找到包帮助和Applet帮助。在上面的步骤中,我只指定了我的包帮助,那么它如何在cap文件中分配Applet帮助呢?

如果您不向转换器提供Applet类/辅助,则该包被视为库包(它是一个没有自己状态的包,仅由可供其他库使用的代码组成,当然还有Applet)。

 类似资料:
  • 我正在使用NSwag并尝试将OpenAPI JSON文档转换为版本2。这是我的配置: 但是,当我将生成的OpenAPI文件粘贴到Swagger Editor中时,它会显示错误: 如何配置NSwag以生成正确的OpenAPI 2.0文件?

  • 我必须在运行时动态生成一个xml文件。请帮助我使用PHP动态生成下面的XML文件。 null

  • 我有一个问题,生成一个分层的pdf页面使用PDFbox。我在这里看到过几篇关于这个主题的文章,但它们都集中在将页面从另一个pdf导入到目标文档中。 我创建了一个类MapImage,它包含纸张大小(以像素为单位)和一个我想要添加到单个pdf页面的BufferedImages列表。 不幸的是,生成的PDF已损坏。我试图创建一个页面,只有一个图像(没有图层),但不幸的是,我不知道如何做到这一点。 有人遇

  • 问题内容: json.php代码 我必须生成文件。 问题答案: 这是一个示例代码:

  • 我正在为初级操作系统Luna上的Scratch文本编辑器应用程序编写一个扩展。但是对于扩展的创建,文档实际上是不存在的,我不知道在编写了扩展的主要代码之后如何继续。 我已经写了扩展名。我还不能使用或测试它,因为它需要“安装”。我花了几个小时寻找文档,但它们不存在。然而,我在scratchlaunchpad页面上找到了一条评论 通常,您必须生成一个pluginname.so文件,并将其与plugin

  • 我使用下面的maven pom。xml文件,无法生成querydsl文件。 我发现了一个问题:Kotlin Kapt注释处理器不能与maven一起工作 我想从kotlin实体类生成jpa querydsl文件。 网上有一个很好的例子,说明如何使用 https://github.com/JetBrains/kotlin-examples/blob/master/gradle/kotlin-query