正如您可能知道的,正如中提到的Java 卡开发套件用户指南为Java Card平台编写大型应用程序的关键是将代码划分为单独的包单元。软件包最重要的限制是最大组件大小为 64KB。对于
方法组件:如果应用程序的方法组件的大小超过 64KB,
那么 Java Card 转换器将不会处理该包并返回错误。
所以,在一些特殊情况下我们需要使用Java Card库包。我的问题是如何创建和使用这些Java Card库包?
到目前为止我做了什么?
好吧,我编写了一个非常简单的 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(Netbeans 和 Eclipse)中找不到任何选项来创建cap
库包文件(那些有用于创建的插件cap
我猜,仅来自 Applet 包),我使用命令行创建库的 cap 文件,如下所示:
1.生成.class
上述文件.java
程序:
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
file:
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.cap and libPack.exp“libPack\javacard”目录中的文件。
问题:
- 我是否以正确的方式完成了 Java 卡库包生成过程?
- 如何在我的小程序中使用这个库包来减小我的小程序包的大小?
更新:(基于亲爱的 Vojta 的回答)
为了使整个过程独立于 IDE,我创建了一个.jar
我的图书馆的文件.class
再次在命令行中使用以下命令创建文件:
CMD:> jar cfv mylib.jar D:\LibSRC\libPack\mylib.class
CMD:>
上面的命令从命令行当前目录中的“mylib.class”文件创建了“mylib.jar”。
之后我添加了这个“mylib.jar”文件并且它已经创建了.exp
文件(使用 Converter 的上一步)到 Netbeans IDE 中的 Applet 项目,就像我解释的那样here https://stackoverflow.com/questions/35162385/how-to-add-javacard-packages-to-javacard-applet/35178787#35178787.
现在我想使用sayHello()
我的小程序中我的图书馆的方法:
正如您在上面看到的,我仍然收到错误。那是什么?据我所知,我无法在库包中定义静态方法(对吗?),那么我可以在哪里使用库方法呢?