Java Card CAP 文件组件分析 10—— Export Component

来源:互联网 发布:韩国代购淘宝店推荐 编辑:程序博客网 时间:2024/06/17 12:55

Export组件列出了所有包中可能被其他包中类导入的静态元素,不包括实例域和虚方法。

1
2
3
4
5
6
7
8
9
10
11
12
export_component {
    u1 tag  // COMPONENT_Export (10)
    u2 size
    u1 class_count  // class_exports表中项数,必须大于0
    class_export_info {
        u2 class_offset
        u1 static_field_count
        u1 static_method_count
        u2 static_field_offsets[static_field_count]
        u2 static_method_offsets[static_method_count]
    }   class_exports[class_count]
}

其中class_exports[class_count]为可变长表,若包为一个库包,则表中为每个公共类和公共接口提供一个条目;若包为一个applet包,则表中为包里定义的每个公共可共享的接口提供一个条目。表中特定类或接口的索引值等同于该类或接口的token值,token值在包的Export文件中有列出来。

Export组件需要与class_ref结构体中的external_ref来一起使用。当通过package_token查找到Export组件所在的包之后,再用class_token在Export组件中找到类信息。

在卡内installer中解析Export.cap:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    intiPose = 0;
#define READU1 readU1(pExportComponent,&iPose)
#define READU2 readU2(pExportComponent,&iPose)
    if(sizes[TAG_EXPORT_COMP-1] !=0)
    {
        u1 classCount = READU1;
        COUT<<"Class Count = "<<(int)classCount<<ENDL;
 
        ExportComponent *pEC = newExportComponent(classCount);
 
        for(int_ie=0;_ie<classCount;_ie++)
        {
            u2 _co = READU2;
            u1 _sfc = READU1;
            u1 _smc = READU1;
            pEC->pClassExport[_ie] = newClassExportInfo(_co,_sfc,_smc);
            for(int_isf=0;_isf<_sfc;_isf++)
            {
                pEC->pClassExport[_ie]->pStaticFieldOffsets[_isf]= READU2;
            }
            for(int_ism=0;_ism<_smc;_ism++)
            {
                pEC->pClassExport[_ie]->pStaticMethodOffsets[_ism]=READU2;
            }
        }
 
        newapplet->pExport = pEC;
    }
 
#undef READU2
#undef READU1

 作者:fish
 转自:http://www.dreamingfish123.info/?p=684
0 0
原创粉丝点击