views:

12

answers:

0

I have a C struct like this:

struct HFSUniStr255 {
    UInt16 length;
    UniChar unicode[255];
};

I have mapped this in the expected way:

public class HFSUniStr255 extends Structure
{
    public UInt16 length; // UInt16 is just an IntegerType with length 2 for convenience.

    public /*UniChar*/ char[] unicode = new char[255];
    //public /*UniChar*/ byte[] unicode = new byte[255*2];
    //public /*UniChar*/ UInt16[] unicode = new UInt16[255];

    public HFSUniStr255()
    {
    }

    public HFSUniStr255(Pointer pointer)
    {
        super(pointer);
    }
}

If I use this version, I get every second character of the string into my char[] ("aits D" for "Macintosh HD".) I am assuming that this is something to do with being on a 64-bit platform and JNA mapping the value to a 32-bit wchar_t but then chopping off the high 16 bits on each wchar_t on copying them back.

If I use the byte[] version, I get data which decodes correctly using the UTF-16LE charset.

If I use the UInt16[] version, I get the right code point for each character but it is then inconvenient to convert them back into a string.

Is there some way I can define my type as char[], and yet have it convert correctly?