JNA结构体嵌套如何调用

摘要:
需要详细教程的加QQ:1059585163

一、C语言结构体

typedef structECCrefPublicKey_st {
unsigned intbits;
unsigned charx[ECCref_MAX_LEN];
unsigned chary[ECCref_MAX_LEN];
}ECCrefPublicKey;



typedef structECCCipher_st {
unsigned charx[ECCref_MAX_LEN];
unsigned chary[ECCref_MAX_LEN];
unsigned char M[32];
unsigned intL;
unsigned char C[1024];
}ECCCipher;



typedef ECCCipher ECCCIPHERBLOB;
typedef ECCrefPublicKey ECCPUBLICKEYBLOB;



typedef structSDF_ENVELOPEDKEYBLOB {
unsigned longulAsymmAlgID;
unsigned longulSymmAlgID;
ECCCIPHERBLOB ECCCipherBlob;
ECCPUBLICKEYBLOB PubKey;
unsigned charcbEncryptedPriKey[ECCref_MAX_LEN];
}ENVELOPEDKEYBLOB, * PENVELOPEDKEYBLOB;

二、C语言接口

//生成ECC密钥对的保护结构
int SDF_Ext_GenEnvKeyPairBlob_ECC(void*hSessionHandle,
unsigned intsymmAlgID,
ECCrefPublicKey*pucPublicKey,
ENVELOPEDKEYBLOB* pEnvelopedKeyBlob);

三、jna接口

int SDF_Ext_GenEnvKeyPairBlob_ECC(Pointer var1, NativeLong var2, ECCrefPublicKey.ByReference pucPublicKey, ENVELOPEDKEYBLOB.ByReference blob);

四、JNA结构体

 class ENVELOPEDKEYBLOB extendsStructure {
            publicNativeLong ulAsymmAlgID;
            publicNativeLong ulSymmAlgID;
            publicECCCipher ECCCipherBlob;
            publicECCrefPublicKey PubKey;
            public byte[] cbEncryptedPriKey = new byte[64];

            @Override
            protectedList getFieldOrder() {
                return Arrays.asList("ulAsymmAlgID", "ulSymmAlgID", "ECCCipherBlob", "PubKey", "cbEncryptedPriKey");

            }

            public static class ByValue extends ENVELOPEDKEYBLOB implementsStructure.ByValue {
                publicByValue() {
                }
            }

            public static class ByReference extends ENVELOPEDKEYBLOB implementsStructure.ByReference {
                publicByReference() {
                }
            }
        }
public static class ECCCipher extendsStructure {
            public byte[] x = new byte[64];
            public byte[] y = new byte[64];
            public byte[] M = new byte[32];
            public intL;
            public byte[] C = new byte[1024];

            public static class ByValue extends ECCCipher implementsStructure.ByValue {
                publicByValue() {
                }
            }

            public static class ByReference extends ECCCipher implementsStructure.ByReference {
                publicByReference() {
                }
            }
        }
class ECCrefPublicKey extendsStructure {
            public intbits;
            public byte[] x = new byte[64];
            public byte[] y = new byte[64];

            
            @Override
            protected List<String>getFieldOrder() {
                return Arrays.asList(new String[] {"bits", "x","y"});
            }

            @Override
            publicString toString() {
                return JSON.toJSONString(this);
            }

            public static class ByValue extends ECCrefPublicKey implementsStructure.ByValue {
                publicByValue() {

                }
            }

            public static class ByReference extends ECCrefPublicKey implementsStructure.ByReference {
                publicByReference() {

                }
            }
        }

五、jna调用demo

TestSDF_API.TestCLibrary.ECCCipher ECCCipherBlob = newTestSDF_API.TestCLibrary.ECCCipher();
TestSDF_API.TestCLibrary.ECCrefPublicKey pubKey = newTestSDF_API.TestCLibrary.ECCrefPublicKey();
TestSDF_API.TestCLibrary.ENVELOPEDKEYBLOB.ByReference pEnvelopedKeyBolb = newTestSDF_API.TestCLibrary.ENVELOPEDKEYBLOB.ByReference();
pEnvelopedKeyBolb.setECCCipherBlob(ECCCipherBlob);
pEnvelopedKeyBolb.setPubKey(pubKey);
pEnvelopedKeyBolb.setCbEncryptedPriKey(new byte[64]);
rv = api.Test_SDF_Ext_GenEnvKeyPairBlob_ECC(hSessionHandle, sm4, EncPubKey, pEnvelopedKeyBolb);

搞定。

需要详细教程的加QQ:1059585163

免责声明:文章转载自《JNA结构体嵌套如何调用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#线程学习笔记六:线程同步--信号量和互斥体Android下得到APK包含信息下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Java(使用JNA)调用DLL库与C#调用DLL库的对比

前言:在项目中经常使用DLL库对硬件进行操作,在发卡过程中使用频率尤为多,今天就Java与C#中调用DLL库的使用区别做一个介绍,本文着重具体的代码编写,具体过程看以下代码。 前提条件: 笔者已经封装了一个DLL库名为:testdll.dll(具体封库细节,请查阅相关资料),库中包含两个函数: 注:Add为两个整数相加,Sub为两个整数相减。 1.C#...

linux jna调用so动态库

文中提到:为什么命名为libtest.so而不是test.so呢?因为jna在找so文件的时候,要匹配前缀为lib的so文件 http://zhenaihua0213.blog.163.com/blog/static/50887766201129104611955/在linux下使用jna调用本地方法的时候,需要将C写成的程序编译为so文件 1、写一个简...

JNA调用.a静态库

步骤: 1. 新建.c文件,引入静态库,编译为so动态库 2.JNA调用so 例子: 1.已经存在的静态库文件welcome.h、libwelcome.a #ifndef _WELCOME_H #define _WELCOME_H void welcome(); #endif //welcome.c样例 #include<stdio.h>...

java 用JNA调用dll 参考文档

1Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回 2jna结构体数组JNA结构体数组 3JNA调用C语言动态链接库学习实践总结 4Java 通过 JNA 调用 DLL 返回 char * 字符串乱码问题的解决 5jna对结构体、指针、引用、拷贝参数传递的使用 6jna模拟指针开辟空间,数组首地址获取值 7JNA结构体参数传...