如何创建和使用Java卡库包?

如何创建和使用Java卡库包?,java,javacard,Java,Javacard,正如您可能知道的,正如Java卡开发工具包用户指南中提到的,为Java卡平台编写大型应用程序的关键是将代码划分为单独的包单元。包上最重要的限制是最大组件大小的64KB限制。这一点在美国尤其如此 方法组件:如果应用程序的方法组件的大小超过64KB, 然后Java卡转换器将不处理该包,并返回一个错误 因此,在某些特殊情况下,我们需要使用Java卡库包。我的问题是如何创建和使用这些Java卡库包 到目前为止我做了什么? 我编写了一个非常简单的Java类,其中包含一个名为sayHello()的方法,如下

正如您可能知道的,正如Java卡开发工具包用户指南中提到的,为Java卡平台编写大型应用程序的关键是将代码划分为单独的包单元。包上最重要的限制是最大组件大小的64KB限制。这一点在美国尤其如此 方法组件:如果应用程序的方法组件的大小超过64KB, 然后Java卡转换器将不处理该包,并返回一个错误

因此,在某些特殊情况下,我们需要使用Java卡库包。我的问题是如何创建和使用这些Java卡库包

到目前为止我做了什么?

我编写了一个非常简单的Java类,其中包含一个名为
sayHello()
的方法,如下所示:

package libPack;

import javacard.framework.*;

public class mylib {
    public static final byte[] hello = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};

    protected mylib() {
    }

    public void sayHello(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        Util.arrayCopyNonAtomic(hello, (short)0x00, buffer, (short)0x00, (short)hello.length);
        apdu.setOutgoingAndSend((short)0x00, (short)buffer.length);
    }
}
由于我在IDE-s(Netbeans和Eclipse)中找不到任何选项来创建库软件包的
cap
文件(我想这些软件包只有从Applet软件包创建
cap
),我使用命令行创建库的cap文件,如下所示:

package libPack;

import javacard.framework.*;

public class mylib {
    public static final byte[] hello = {(byte)'H',(byte)'e',(byte)'l',(byte)'l',(byte)'o'};

    protected mylib() {
    }

    public void sayHello(APDU apdu) {
        byte[] buffer = apdu.getBuffer();
        Util.arrayCopyNonAtomic(hello, (short)0x00, buffer, (short)0x00, (short)hello.length);
        apdu.setOutgoingAndSend((short)0x00, (short)buffer.length);
    }
}
1.生成上述
.java
程序的
.class
文件:

CMD:> javac -g -source 1.2 -target 1.2 -cp "D:\JCDK\java_card_kit-2_2_2\lib\api.jar" "D:\LibSrc\mylib.java"
warning: [options] bootstrap class path not set in conjunction with -source 1.2
1 warning

CMD:>
上面的命令生成一个名为my library类名的
.class
文件。我在同一个目录中创建了一个文件夹,并将其命名为“libPack”(程序包名),然后将这个
.class
文件移到其中

2.将创建的
.class
文件转换为
.cap
文件:

CMD:> D:\JCDK\java_card_kit-2_2_2\bin\converter.bat -debug -verbose -exportpath D:\JCDK\java_card_kit-2_2_2\api_export_files -classdir D:\LibSRC libPack 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 D:\LibSRC\libPack\mylib.class
converting libPack.mylib
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\java\lang\javacard\lang.exp
parsing D:\JCDK\java_card_kit-2_2_2\api_export_files\javacard\framework\javacard\framework.exp
writing D:\LibSRC\libPack\javacard\libPack.exp
writing D:\LibSRC\libPack\javacard\libPack.jca

conversion completed with 0 errors and 0 warnings.

CMD:>
在上面的命令中,在“libPack\javacard”目录中生成libPack.cap和libPack.exp文件

问题:

  • 我是否以正确的方式完成了Java卡库包生成过程
  • 如何在我的小程序中使用此库包来减小小程序包的大小

  • 更新:(基于亲爱的Vojta的回答)

    为了使整个过程独立于IDE,我再次在命令行中使用以下命令创建了我的库
    .class
    文件的
    .jar
    文件:

    CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
    CMD:>
    
    上面的命令从命令行当前目录中的“mylib.class”文件创建了“mylib.jar”

    之后,我将这个“mylib.jar”文件及其已创建的
    .exp
    文件(使用转换器的上一步)添加到Netbeans IDE中的小程序项目中,方法与我解释的相同

    现在我想在我的小程序中使用我的库的
    sayHello()
    方法:


    如上所述,我仍然收到一个错误。那是什么?据我所知,我不能在库包中定义静态方法(对吗?),所以我可以在哪里使用库方法?

    任何带有一些公共类和公共方法的Java卡包都可以用作库。如果您使用Eclipse JCOP工具,则可以非常轻松地构建库:cap文件将在以下文件夹中自动创建:

    /[workspace]/[project]/bin/[path according to package]/javacard
    
    Java卡库就是任何包;甚至带有
    Applet
    的包也可以作为一个包使用。因此,构建一个“公共”的
    cap
    文件和一个“库”的
    cap
    文件之间没有真正的区别


    注意,在库包中实现
    Shareable
    接口的对象和静态方法之间有一些区别<代码>可共享接口可用于通过防火墙从上下文B访问上下文A中的对象实例。但是,
    静态
    方法可从任何上下文访问-不适用防火墙规则。有一个很好的概述。关于
    静态方法的最重要段落是6.1.6:

    类对象的实例由上下文拥有;课程本身并非如此。在访问类静态字段时,无法执行运行时上下文检查。调用静态方法时也没有上下文切换

    公共静态字段和公共静态方法可以从任何 上下文:静态方法在与其调用方相同的上下文中执行

    静态字段中引用的对象只是常规对象。他们是 由创建它们的人和标准防火墙访问规则所有 申请。如果有必要在多个上下文中共享它们,那么 这些对象需要是可共享接口对象(SIO)

    当然,传统的Java技术保护仍然很重要 强制用于静态字段和方法。此外,当小程序 安装后,安装程序将验证每次尝试链接到 允许使用外部静电场或方法。安装及 有关链接的详细信息超出了本规范的范围

    简而言之:静态库中没有静态对象=不需要
    Shareable


    您有时需要在新的小程序中使用现有的库,尽管您没有该库的源代码。该库可能已由供应商或某些第三方加载到您的卡中。您需要库的
    jar
    文件和
    exp
    文件才能在小程序中使用它

    您需要在一个公共Java
    jar
    文件中包含库的类文件,以便通过Java编译器构建新的类文件。然后,您需要一些额外的信息,以便Java卡转换器将代码与库类及其方法链接起来。这就是
    exp
    文件的用途。
    exp
    文件描述了
    cap
    文件中所有公共组件的接口和依赖关系。EclipseJCOP工具与Java卡转换器一样,在同一文件夹中创建
    exp
    文件和
    cap
    文件。()

    exp
    文件和
    jar
    文件是构建使用库的代码所需的全部。只需将它们都放在项目中,并确保
    jar
    文件位于项目的构建路径上

    请随便问。