前言
关于环境和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);
}
}