有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

您可能知道,正如《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文件(我想那些只有从小程序包创建cap的插件),我使用命令行创建库的cap文件,如下所示:

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:>

上面的命令生成一个.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。caplibPack。exp文件在“libPack\javacard”目录中

问题:

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

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

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

CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
CMD:>

上面的命令从命令行当前目录中的“mylib.class”文件创建了“mylib.jar”

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

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

enter image description here

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


共 (1) 个答案

  1. # 1 楼答案

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

    /[workspace]/[project]/bin/[path according to package]/javacard
    

    Java卡库就是任何包;甚至带有Applet的包也可以用作一个包。因此,构建一个“公共”cap文件和一个“库”cap文件之间没有真正的区别


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

    Instances of classes—objects—are owned by contexts; classes themselves are not. There is no runtime context check that can be performed when a class static field is accessed. Neither is there a context switch when a static method is invoked.

    Public static fields and public static methods are accessible from any context: static methods execute in the same context as their caller.

    Objects referenced in static fields are just regular objects. They are owned by whomever created them and standard firewall access rules apply. If it is necessary to share them across multiple contexts, then these objects need to be Shareable Interface Objects (SIOs).

    Of course, the conventional Java technology protections are still enforced for static fields and methods. In addition, when applets are installed, the Installer verifies that each attempt to link to an external static field or method is permitted. Installation and specifics about linkage are beyond the scope of this specification.

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


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

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

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

    请随便问