如何在 Java 卡片小程序中尝试使用原生方法?

How to try using Native Methods in Java card applets?

这是一个简单的 Hello World Javacards 小程序:

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);
  }
}

问题是"What is the meaning of native methods in java cards?"

在智能卡的安全目标中,写着"using Native Methods in applications is prevented."问题是"How I can test it for a specific card?"换句话说,我希望你修改上面的代码并向其添加一些本地方法并且让我检查是否可以将其转换为 .cap 文件并上传到我的卡上。

更新:

正如亲爱的 TonyK 在第一条评论中所说,大概我的开发环境不会编译这样的东西,所以有两个问题:

  1. 什么是本机方法?有例子吗?
  2. 我如何编译它们并将那些内部具有这种方法的程序转换为 .cap 文件以尝试将它们上传到卡上?

本地方法是用另一种编程语言(即不在 Java 中)编写的方法,可以由 Java 程序调用。对于智能卡,本地方法通常用 C 代码或机器代码编写,并直接在底层智能卡处理器上执行(而 Java 卡应用程序在 Java 卡虚拟机中执行)。

关于 Java Card 语言和使用 CAP 文件加载到 Java Card 上的小程序的执行,您实际上不必担心本地方法:

  • Java Card 规范不支持 native 关键字,因此您无法声明本地方法(参见 Virtual Machine Specification,Java Card Platform,Version 2.2.2 第 2-4 页)。
  • CAP文件格式不支持原生方法,所以不能上传声明了原生方法的小程序。 (请参阅 运行时环境规范,Java 卡片平台,版本 2.2.2,第 Glossary-6 页)。