JNA(十四)共用体数组

文章介绍了如何在C语言和Java中通过JNA处理动态链接库,包括定义共用体、结构体和数组,以及如何在两个语言间进行数据交换和清理内存的操作。
摘要由CSDN通过智能技术生成

前言

关于环境和dll的生成,不懂的同学可以去查看JNA(一)与JNA(二)的内容
共用体数组

操作

1.C语言代码

头文件(library.h)

#ifndef CDYNAMICDEMO_LIBRARY_H
#define CDYNAMICDEMO_LIBRARY_H

#include <string.h>
#include <stdlib.h>

// 共用体
typedef union Share {
    int num;
    float score;
    char *name;
} Share;

enum ShareType {
    NUM = 0, FLOAT = 1, CHAR = 2
};

typedef struct ShareStruct {
    enum ShareType shareType;
    Share share;
} ShareStruct;

//共用体数组
typedef struct ArrayUnion {
    int num;
    ShareStruct *shares;
} ArrayUnion;

void setArrayUnion(ArrayUnion *arrayUnion);

ArrayUnion getArrayUnion();

void cleanArrayUnion(ArrayUnion arrayUnion);

#endif //CDYNAMICDEMO_LIBRARY_H

代码文件(library.c)

#include "library.h"
#include <stdio.h>

void setArrayUnion(ArrayUnion *arrayUnion) {
    int num = arrayUnion->num;
    for (int i = 0; i < num; i++) {
        switch (arrayUnion->shares[i].shareType) {
            case NUM:
                printf("\nnum is: %d", arrayUnion->shares[i].share.num);
                break;
            case 1:
                printf("\nscore is: %f", arrayUnion->shares[i].share.score);
                break;
            case 2:
                printf("\nname is: %s", arrayUnion->shares[i].share.name);
                break;
            default:
                printf("\nunknown type.");

        }
    }
    printf("\n clean union array finish.");
}

ArrayUnion getArrayUnion() {
    ArrayUnion arrayUnion;
    arrayUnion.num = 5;
    arrayUnion.shares = malloc(sizeof(ShareStruct) * arrayUnion.num);
    memset(arrayUnion.shares, 0, sizeof(ShareStruct) * arrayUnion.num);

    arrayUnion.shares[0].shareType = NUM;
    arrayUnion.shares[0].share.num = 102;

    arrayUnion.shares[1].shareType = FLOAT;
    arrayUnion.shares[1].share.score = 98.5f;

    arrayUnion.shares[2].shareType = CHAR;
    arrayUnion.shares[2].share.name = "张三";

    arrayUnion.shares[3].shareType = FLOAT;
    arrayUnion.shares[3].share.score = 99.5f;

    arrayUnion.shares[4].shareType = CHAR;
    arrayUnion.shares[4].share.name = "Lisi";

    return arrayUnion;
}

void cleanArrayUnion(ArrayUnion arrayUnion) {
    free(arrayUnion.shares);
}

2.java代码

package com.dynamic.demo.union;

import com.sun.jna.*;
import lombok.Getter;
import lombok.Setter;

import java.util.Arrays;
import java.util.List;

public interface UnionArrayLibrary extends Library {
    UnionArrayLibrary INSTANCE = Native.load(Platform.isWindows() ? "libCDynamicDemo" : "", UnionArrayLibrary.class);

    void setArrayUnion(ArrayUnion.ByReference arrayUnion);

    ArrayUnion.ByValue getArrayUnion();

    void cleanArrayUnion(ArrayUnion.ByValue arrayUnion);

    @Getter
    @Setter
    static class Share extends Union {
        public static class ByValue extends Share implements Structure.ByValue {
        }

        public int num;
        public float score;
        public String name;
    }

    @Getter
    @Setter
    static class ShareStruct extends Structure {
        public static final int NUM = 0, FLOAT = 1, CHAR = 2;

        public static class ByReference extends ShareStruct implements Structure.ByReference {
        }

        public static class ByValue extends ShareStruct implements Structure.ByValue {
        }

        public int shareType;
        public Share share;

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList("shareType", "share");
        }
    }

    @Getter
    @Setter
    static class ArrayUnion extends Structure {
        public static final int NUM = 0, FLOAT = 1, CHAR = 2;

        public static class ByReference extends ArrayUnion implements Structure.ByReference {
        }

        public static class ByValue extends ArrayUnion implements Structure.ByValue {
        }

        public int num;
        public ShareStruct.ByReference shares;

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList("num", "shares");
        }
    }

    public static void main(String[] args) {
        ArrayUnion.ByReference arrayUnion = new ArrayUnion.ByReference();
        arrayUnion.num = 4;

        ShareStruct.ByReference shares = new ShareStruct.ByReference();
        ShareStruct.ByReference[] shareArray = (ShareStruct.ByReference[]) shares.toArray(arrayUnion.num);

        shareArray[0].shareType = 0;
        // 这个类型要用基本类型,或者Integer.TYPE
        shareArray[0].share.setType(int.class);
        shareArray[0].share.num = 2020;

        shareArray[1].shareType = 1;
        shareArray[1].share.setType(float.class);
        shareArray[1].share.score = 2020.12F;

        shareArray[2].shareType = 2;
        shareArray[2].share.setType(String.class);
        shareArray[2].share.name = "中华";

        shareArray[3].shareType = 3;
        arrayUnion.setShares(shares);

        UnionArrayLibrary.INSTANCE.setArrayUnion(arrayUnion);

        ArrayUnion.ByValue arrayUnion1 = UnionArrayLibrary.INSTANCE.getArrayUnion();

        System.out.println("共用体数量: " + arrayUnion1.num);
        ShareStruct.ByReference[] array = (ShareStruct.ByReference[]) arrayUnion1.shares.toArray(arrayUnion1.num);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i].shareType);
        }

        UnionArrayLibrary.INSTANCE.cleanArrayUnion(arrayUnion1);
    }
}

3.查看输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值