Skip to content

TypeMapper bug in direct-mapped library #467

@twall

Description

@twall

Sample failing test case:

public static enum Enumeration {
    STATUS_0(0), STATUS_1(1), STATUS_ERROR(-1);
    private final int code;
    Enumeration(int code) { this.code = code; }
    public int getCode() { return code; }
    public static Enumeration fromCode(int code) {
        switch(code) {
        case 0: return STATUS_0;
        case 1: return STATUS_1;
        default: return STATUS_ERROR;
        }
    }
}
public static class DirectTypeMappedEnumerationTestLibrary {
    public native Enumeration returnInt32Argument(Enumeration e);
    static {
        DefaultTypeMapper mapper = new DefaultTypeMapper();
        mapper.addTypeConverter(Enumeration.class, new TypeConverter() {
            public Object toNative(Object arg, ToNativeContext ctx) {
                return new Integer(((Enumeration)arg).getCode());
            }
            public Object fromNative(Object value, FromNativeContext context) {
                return Enumeration.fromCode(((Integer)value).intValue());
            }
            public Class nativeType() {
                return Integer.class;
            }
        });
        Map options = new HashMap();
        options.put(Library.OPTION_TYPE_MAPPER, mapper);

        Native.register(NativeLibrary.getInstance("testlib", options));
    }
}
public void testEnumerationConversion() {
    DirectTypeMappedEnumerationTestLibrary lib = new DirectTypeMappedEnumerationTestLibrary();
    Enumeration e = lib.returnInt32Argument(Enumeration.STATUS_1);
    assertEquals("Failed to convert enumeration", Enumeration.STATUS_1, e);
}
java -cp build/classes:build/test-classes:lib/junit.jar -Djna.library.path=build/native-darwin com.sun.jna.DirectTypeMapperTest
..E.....
Time: 0.06
There was 1 error:
1) testEnumerationConversion(com.sun.jna.DirectTypeMapperTest)java.lang.ExceptionInInitializerError
    at com.sun.jna.DirectTypeMapperTest.testEnumerationConversion(DirectTypeMapperTest.java:225)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.sun.jna.DirectTypeMapperTest.main(DirectTypeMapperTest.java:231)
Caused by: java.lang.IllegalArgumentException: Unsupported Structure field type class com.sun.jna.DirectTypeMapperTest$Enumeration
    at com.sun.jna.Structure$FFIType.get(Structure.java:1843)
    at com.sun.jna.Structure$FFIType.get(Structure.java:1798)
    at com.sun.jna.Native.register(Native.java:1447)
    at com.sun.jna.Native.register(Native.java:1175)
    at com.sun.jna.DirectTypeMapperTest$DirectTypeMappedEnumerationTestLibrary.<clinit>(DirectTypeMapperTest.java:221)
    ... 18 more

FAILURES!!!
Tests run: 7,  Failures: 0,  Errors: 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions