java 调用dll的 指针类型结构体及指针数组类型

C语言定义

struct SerialNum
{
    int id;
    char msg[32];
};

struct Staff
{
    SerialNum * pSNs;
    int nCount;
};

java 调用,

把结构体用class 调用

//包含字符数组的结构    
    public static class SerialNum extends Structure
    {
        public static class ByReference extends SerialNum implements Structure.ByReference {};
        public static class ByValue extends SerialNum implements Structure.ByValue{};
        
        public int id;
        public byte msg[] = new byte[32];
        
        public SerialNum(){
            this.allocateMemory();
        }
        
        public int setMSG(String str){           
            return StringToFixedBytes(str, msg);
        }
        
        public String getMsg(){
            return BytesToString(msg);
        }

//用于带数组指针的结构
    public static class Staff extends Structure{
        public static class ByReference extends Staff implements Structure.ByReference {};
        
        public SerialNum.ByReference pSN;
        public int nCount;
        
        public Staff() {nCount=0;}
        public SerialNum.ByReference[] toArray() {
            return (SerialNum.ByReference[]) pSN.toArray(nCount);
        }
    }

调用的时候:

SerialNum sn = new SerialNum();    
        sn.id = 9000;
        sn.msg = "192.168.1.252".getBytes();
    //    sn.setMSG("abc你好");            
        DllInterface.INSTANCE.AssignSN(sn);
        System.out.println(sn.id + ", " + sn.getMsg());       

调用的时候

        System.out.println("---------9.带数组指针的结构-----------");
        Staff.ByReference pStaff9 = new Staff.ByReference();    
        DllInterface.INSTANCE.GetStaff(pStaff9);
        
        SerialNum.ByReference [] sns9 = pStaff9.toArray();
        
        for(int i=0; i<pStaff9.nCount; i++){
            System.out.println(sns9[i].getMsg());
        }
        
        DllInterface.INSTANCE.FreeMemory(pStaff9.pSN.getPointer());   

参考:

https://blog.csdn.net/gwd1154978352/article/details/55097376

Java 类型

类型

原生表现

 

 boolean

 int

 32位整数(可定制)

 

 byte

 char 

 8位整数

 

 char

 wchar_t

 平台依赖

 

 short

 short

 16位整数

 

 int

 int

 32位整数

 

 long

long long, __int64

 64位整数

 

 float

 float

 32位浮点数

 

 double

 double

 64位浮点数

 

 Buffer/Pointer

 pointer

 平台依赖(3264位指针)

 

 <T>[] (基本类型的数组)

 pointer/array

3264位指针(参数/返回值)

邻接内存(结构体成员)

 

 String

 char*

/0结束的数组 (native encoding or jna.encoding)

 

 WString

 wchar_t*

 /0结束的数组(unicode)

 

 String[]

 char**

 /0结束的数组的数组

 

 WString[]

 wchar_t**

 /0结束的宽字符数组的数组

 

 Structure

 struct*/struct

指向结构体的指针(参数或返回值) (或者明确指定是结构体指针)结构体(结构体的成员) (或者明确指定是结构体)

 

 Union

union 

 等同于结构体

 

 Structure[]

 struct[]

 结构体的数组,邻接内存

 

 Callback

 <T> (*fp)()

 Java函数指针或原生函数指针

 

 NativeMapped

 varies

 依赖于定义

 

 NativeLong

 long

 平台依赖(3264位整数)

 

 PointerType

 pointer

 Pointer相同

 

 

猜你喜欢

转载自my.oschina.net/mellen/blog/1817315