From 5887a8079a4466a1e4bc52c23dd2c4dc7cbfaa88 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Sat, 14 Jan 2017 22:58:20 -0700 Subject: [PATCH 01/11] turn off doclint in the java 8 compiler --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index ec9a1b41..c7291785 100644 --- a/pom.xml +++ b/pom.xml @@ -526,5 +526,14 @@ BridJ is opensource software. Please refer to LICENSE.BridJ.txt to know under wh + + disable-java8-doclint + + [1.8,) + + + -Xdoclint:none + + From bc17c24c139fb57db6ae840af79f8ac1ed1cd897 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Sat, 14 Jan 2017 22:58:59 -0700 Subject: [PATCH 02/11] ignore .DS_Store files created by OSX --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c3592143..1d706680 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ dalvik .classpath .project .settings +.DS_Store From cf0c6977f13e386414ee95734c7465b8cc380eb4 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Sat, 14 Jan 2017 23:57:37 -0700 Subject: [PATCH 03/11] add classmate and retrolambda to the pom. --- .travis.yml | 2 +- pom.xml | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8b1c552b..d669105a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ jdk: - oraclejdk8 #- oraclejdk7 #- openjdk7 - - openjdk6 + #- openjdk6 compiler: - gcc diff --git a/pom.xml b/pom.xml index c7291785..ef97e70b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ bridj BridJ (NativeLibs4Java C/C++ Interop Layer) http://code.google.com/p/bridj/ - 0.7.1-SNAPSHOT + 0.8.0-SNAPSHOT bundle @@ -25,6 +25,11 @@ v0_7_0 true + 1.8 + 1.8 + 1.8 + 1.8 + 1.6 scm:git:git@github.com:nativelibs4java/BridJ.git @@ -48,6 +53,11 @@ asm 5.0.3 + + com.fasterxml + classmate + 1.3.3 + org.osgi org.osgi.core @@ -109,6 +119,53 @@ + + maven-compiler-plugin + 3.6.0 + + ${maven.compiler.source} + ${maven.compiler.target} + ${maven.compiler.testSource} + ${maven.compiler.testTarget} + + + + default-compile + compile + + compile + + + ${maven.compiler.source} + ${maven.compiler.target} + + + + default-testCompile + test-compile + + testCompile + + + ${maven.compiler.testSource} + ${maven.compiler.testTarget} + + + + + + net.orfjackal.retrolambda + retrolambda-maven-plugin + 2.4.0 + + + + process-main + process-test + + + + org.apache.felix maven-bundle-plugin From 7662f560f647d63b90e83090de82eb5b3029a020 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Sun, 15 Jan 2017 00:36:50 -0700 Subject: [PATCH 04/11] corrected issues with Pointer in generated PointerTest --- src/test/velocity/org/bridj/PointerTest.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/test/velocity/org/bridj/PointerTest.java b/src/test/velocity/org/bridj/PointerTest.java index de3c191b..9ce7d55e 100644 --- a/src/test/velocity/org/bridj/PointerTest.java +++ b/src/test/velocity/org/bridj/PointerTest.java @@ -675,10 +675,15 @@ public void testUpdateDirectBufferOnNonBufferBoundPointer() { assertTrue(!it.hasNext()); } +#if ($prim.Name == "Pointer") +#set ($rawTypeRef = "?") +#else +#set ($rawTypeRef = $prim.rawTypeRef) +#end @Test public void testPointerTo_${prim.Name}_Values() { // Test pointerToInts(int...) - Pointer<${prim.rawTypeRef}> p = Pointer.pointerTo${prim.CapName}s(${prim.value($v1)}, ${prim.value($v2)}, ${prim.value($v3)}); + Pointer<${rawTypeRef}> p = Pointer.pointerTo${prim.CapName}s(${prim.value($v1)}, ${prim.value($v2)}, ${prim.value($v3)}); assertEquals(${prim.value($v1)}, (${prim.Name})p.get(0)$precisionArg); assertEquals(${prim.value($v2)}, (${prim.Name})p.get(1)$precisionArg); assertEquals(${prim.value($v3)}, (${prim.Name})p.get(2)$precisionArg); @@ -699,7 +704,7 @@ public void testUpdateDirectBufferOnNonBufferBoundPointer() { } @Test public void testPointerTo_${prim.Name}_Value() { - Pointer<${prim.rawTypeRef}> p = Pointer.pointerTo${prim.CapName}(${prim.value($v1)}); + Pointer<${rawTypeRef}> p = Pointer.pointerTo${prim.CapName}(${prim.value($v1)}); assertEquals(${prim.value($v1)}, (${prim.Name})p.get(0)$precisionArg); p = Pointer.pointerTo${prim.CapName}(${prim.rawValue($v1)}); From 07a923530704aa41237b98cf711e15fea08270c1 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Tue, 17 Jan 2017 22:33:20 -0700 Subject: [PATCH 05/11] first pass at adding classmate based resolution. Test suite passing. Old code is still present. --- .../org/bridj/StructFieldDeclaration.java | 167 ++++++++++++++++++ .../org/bridj/StructFieldDescription.java | 23 ++- src/main/java/org/bridj/StructUtils.java | 2 +- src/main/java/org/bridj/util/Utils.java | 5 + src/main/velocity/org/bridj/PointerIO.java | 28 ++- .../org/bridj/StructFieldDeclarationTest.java | 68 +++++++ .../java/org/bridj/StructGenericsTest.java | 51 ++++++ 7 files changed, 336 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/bridj/StructFieldDeclarationTest.java create mode 100644 src/test/java/org/bridj/StructGenericsTest.java diff --git a/src/main/java/org/bridj/StructFieldDeclaration.java b/src/main/java/org/bridj/StructFieldDeclaration.java index 2be78874..1aa5d732 100644 --- a/src/main/java/org/bridj/StructFieldDeclaration.java +++ b/src/main/java/org/bridj/StructFieldDeclaration.java @@ -37,7 +37,11 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import org.bridj.ann.Alignment; import org.bridj.ann.Array; @@ -45,6 +49,19 @@ import org.bridj.ann.Field; import org.bridj.ann.Union; +import com.fasterxml.classmate.AnnotationConfiguration; +import com.fasterxml.classmate.AnnotationInclusion; +import com.fasterxml.classmate.Filter; +import com.fasterxml.classmate.MemberResolver; +import com.fasterxml.classmate.ResolvedType; +import com.fasterxml.classmate.ResolvedTypeWithMembers; +import com.fasterxml.classmate.TypeResolver; +import com.fasterxml.classmate.members.RawField; +import com.fasterxml.classmate.members.RawMethod; +import com.fasterxml.classmate.members.ResolvedField; +import com.fasterxml.classmate.members.ResolvedMember; +import com.fasterxml.classmate.members.ResolvedMethod; + class StructFieldDeclaration { final StructFieldDescription desc = new StructFieldDescription(); @@ -58,6 +75,7 @@ public String toString() { return desc.name + " (index = " + index + (unionWith < 0 ? "" : ", unionWith = " + unionWith) + ", desc = " + desc + ")"; } + @Deprecated protected static boolean acceptFieldGetter(Member member, boolean getter) { if ((member instanceof Method) && ((Method) member).getParameterTypes().length != (getter ? 0 : 1)) { return false; @@ -71,16 +89,30 @@ protected static boolean acceptFieldGetter(Member member, boolean getter) { return !Modifier.isStatic(modifiers); } + + protected static boolean acceptFieldGetter(ResolvedMember member, boolean getter) { + if ((member instanceof ResolvedMethod) && ((ResolvedMethod) member).getRawMember().getParameterTypes().length != (getter ? 0 : 1)) { + return false; + } + + if (member.get(Field.class) == null) { + return false; + } + + return !member.isStatic(); + } /** * Creates a list of structure fields */ + @Deprecated protected static List listFields(Class structClass) { List list = new ArrayList(); for (Method method : structClass.getMethods()) { if (acceptFieldGetter(method, true)) { StructFieldDeclaration io = fromGetter(method); try { + // this only works when the names are equal, does not support setXXX methods. Method setter = structClass.getMethod(method.getName(), io.valueClass); if (acceptFieldGetter(setter, false)) { io.setter = setter; @@ -110,7 +142,81 @@ protected static List listFields(Class structClass) { return list; } + + protected static List listFields2(Class structClass) { + List list = new ArrayList(); + ResolvedTypeWithMembers resolvedStruct = resolveType(structClass); + for (ResolvedMethod method : resolvedStruct.getMemberMethods()) { + if (acceptFieldGetter(method, true)) { + StructFieldDeclaration io = fromGetter(method); + try { + // this only works when the names are equal, does not support setXXX methods. + ResolvedMethod setter = getMethod( resolvedStruct.getMemberMethods(), method.getName(), io.valueClass); + if (acceptFieldGetter(setter, false)) { + io.setter = setter.getRawMember(); + } + } catch (Exception ex) { + //assert BridJ.info("No setter for getter " + method); + } + if (io != null) { + list.add(io); + } + } + } + int nFieldFields = 0; + for ( ResolvedField field : resolvedStruct.getMemberFields()) { + if (acceptFieldGetter(field, true)) { + StructFieldDeclaration io = StructFieldDeclaration.fromField(field); + if (io != null) { + list.add(io); + nFieldFields++; + } + } + } + if (nFieldFields > 0 && BridJ.warnStructFields) { + BridJ.warning("Struct " + structClass.getName() + " has " + nFieldFields + " struct fields implemented as Java fields, which won't give the best performance and might require counter-intuitive calls to BridJ.readFromNative / .writeToNative. Please consider using JNAerator to generate your struct instead, or use BRIDJ_WARN_STRUCT_FIELDS=0 or -Dbridj.warnStructFields=false to mute this warning."); + } + + return list; + } + + public static ResolvedMethod getMethod( ResolvedMethod[] methods, String name, Class... params ) { + METHODS: for( ResolvedMethod method : methods ) { + if( !name.equals(method.getName()) ) continue METHODS; + if( params.length != method.getArgumentCount()) continue METHODS; + for( int i = 0; i < params.length; i++ ) { + if( !method.getArgumentType(i).isInstanceOf(params[i])) continue METHODS; + } + return method; + } + return null; + } + + protected static String nameForMember( ResolvedMember member ) { + String name = member.getName(); + if (name.matches("get[A-Z].*")) { + return Character.toLowerCase(name.charAt(3)) + name.substring(4); + } else if ( name.matches("set[A-Z].*")) { + return Character.toLowerCase(name.charAt(3)) + name.substring(4); + } else { + return name; + } + } + + protected static ResolvedTypeWithMembers resolveType( Class structClass ) { + TypeResolver resolver = new TypeResolver(); + ResolvedType classType = resolver.resolve(structClass); + MemberResolver mr = new MemberResolver(resolver); + mr.setMethodFilter(method-> + method.getRawMember().getParameterTypes().length < 2 && + !method.isStatic()); + mr.setFieldFilter(field->!field.isStatic()); + AnnotationConfiguration annConfig = new AnnotationConfiguration.StdConfiguration(AnnotationInclusion.INCLUDE_BUT_DONT_INHERIT); + return mr.resolve(classType, annConfig, null); + } + + @Deprecated protected static StructFieldDeclaration fromField(java.lang.reflect.Field getter) { StructFieldDeclaration field = fromMember((Member) getter); field.desc.field = getter; @@ -119,6 +225,15 @@ protected static StructFieldDeclaration fromField(java.lang.reflect.Field getter return field; } + protected static StructFieldDeclaration fromField(ResolvedField getter) { + StructFieldDeclaration field = fromMember((ResolvedField) getter); + field.desc.field = getter.getRawMember(); + field.desc.valueType = getter.getType(); + field.valueClass = getter.getType().getErasedType(); + return field; + } + + @Deprecated protected static StructFieldDeclaration fromGetter(Method getter) { StructFieldDeclaration field = fromMember((Member) getter); field.desc.getter = getter; @@ -127,6 +242,15 @@ protected static StructFieldDeclaration fromGetter(Method getter) { return field; } + protected static StructFieldDeclaration fromGetter(ResolvedMethod getter) { + StructFieldDeclaration field = fromMember((ResolvedMember) getter); + field.desc.getter = getter.getRawMember(); + field.desc.valueType = getter.getReturnType(); + field.valueClass = getter.getReturnType().getErasedType(); + return field; + } + + @Deprecated private static StructFieldDeclaration fromMember(Member member) { StructFieldDeclaration field = new StructFieldDeclaration(); field.declaringClass = member.getDeclaringClass(); @@ -170,4 +294,47 @@ private static StructFieldDeclaration fromMember(Member member) { field.desc.isSizeT = isAnnotationPresent(org.bridj.ann.Ptr.class, getter); return field; } + + private static StructFieldDeclaration fromMember(ResolvedMember member) { + StructFieldDeclaration field = new StructFieldDeclaration(); + field.declaringClass = member.getRawMember().getDeclaringClass(); + + String name = member.getName(); + if (name.matches("get[A-Z].*")) { + name = Character.toLowerCase(name.charAt(3)) + name.substring(4); + } + + field.desc.name = name; + + Field fil = member.get(Field.class); + Bits bits = member.get(Bits.class); + Alignment alignment = member.get(Alignment.class); + Array arr = member.get(Array.class); + if (fil != null) { + field.index = fil.value(); + //field.byteOffset = fil.offset(); + field.unionWith = fil.unionWith(); + } + if (field.unionWith < 0 && field.declaringClass.getAnnotation(Union.class) != null) { + field.unionWith = 0; + } + + if (bits != null) { + field.desc.bitLength = bits.value(); + } + if (alignment != null) { + field.desc.alignment = alignment.value(); + } + if (arr != null) { + long length = 1; + for (long dim : arr.value()) { + length *= dim; + } + field.desc.arrayLength = length; + field.desc.isArray = true; + } + field.desc.isCLong = member.get(org.bridj.ann.CLong.class) != null; + field.desc.isSizeT = member.get(org.bridj.ann.Ptr.class) != null; + return field; + } } diff --git a/src/main/java/org/bridj/StructFieldDescription.java b/src/main/java/org/bridj/StructFieldDescription.java index 4f4c2759..151c2021 100644 --- a/src/main/java/org/bridj/StructFieldDescription.java +++ b/src/main/java/org/bridj/StructFieldDescription.java @@ -55,6 +55,8 @@ import org.bridj.util.DefaultParameterizedType; import org.bridj.util.Utils; +import com.fasterxml.classmate.ResolvedType; + /** * Internal metadata on a struct field */ @@ -90,7 +92,12 @@ static Type resolveType(Type tpe, Type structType) { } Type ret; - if (tpe instanceof ParameterizedType) { + if (tpe instanceof ResolvedType ) { + ResolvedType rt = (ResolvedType)tpe; + // TODO: what do we do here? + ret = tpe; + } + else if (tpe instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) tpe; Type[] actualTypeArguments = pt.getActualTypeArguments(); Type[] resolvedActualTypeArguments = new Type[actualTypeArguments.length]; @@ -178,8 +185,18 @@ static StructFieldDescription aggregateDeclarations(Type structType, List fixIntegralTypeIOToMatchLength(Pointer ptr, long byteLength @SuppressWarnings("deprecation") protected static void computeStructLayout(StructDescription desc, StructCustomizer customizer) { - List fieldDecls = StructFieldDeclaration.listFields(desc.structClass); + List fieldDecls = StructFieldDeclaration.listFields2(desc.structClass); orderFields(fieldDecls); customizer.beforeAggregation(desc, fieldDecls); diff --git a/src/main/java/org/bridj/util/Utils.java b/src/main/java/org/bridj/util/Utils.java index a9c3b3b3..6087bbd8 100644 --- a/src/main/java/org/bridj/util/Utils.java +++ b/src/main/java/org/bridj/util/Utils.java @@ -48,6 +48,8 @@ import java.nio.LongBuffer; import java.nio.ShortBuffer; +import com.fasterxml.classmate.ResolvedType; + /** * Miscellaneous utility methods. * @@ -162,6 +164,9 @@ public static Class getClass(Type type) { if (type instanceof Class) { return (Class) type; } + if (type instanceof ResolvedType ) { + return (Class)((ResolvedType) type).getErasedType(); + } if (type instanceof ParameterizedType) { return getClass(((ParameterizedType) type).getRawType()); } diff --git a/src/main/velocity/org/bridj/PointerIO.java b/src/main/velocity/org/bridj/PointerIO.java index 5afa0aa8..7333159b 100644 --- a/src/main/velocity/org/bridj/PointerIO.java +++ b/src/main/velocity/org/bridj/PointerIO.java @@ -30,6 +30,8 @@ */ package org.bridj; +import com.fasterxml.classmate.ResolvedType; + import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.*; @@ -94,6 +96,8 @@ public Type getTargetType() { static Class getClass(Type type) { if (type instanceof Class) return (Class)type; + if (type instanceof ResolvedType) + return ((ResolvedType)type).getErasedType(); if (type instanceof ParameterizedType) return getClass(((ParameterizedType)type).getRawType()); return null; @@ -149,12 +153,24 @@ public static

PointerIO

getInstance(Type type) { if (type == null) return null; - PointerIO io = ios.get(type); + PointerIO io = null; + + if( type instanceof ResolvedType ) { + io = ios.get(((ResolvedType) type).getErasedType()); + } + if( io == null ) { + io = ios.get(type); + } if (io == null) { final Class cl = Utils.getClass(type); if (cl != null) { - if (cl == Pointer.class) - io = getPointerInstance(((ParameterizedType)type).getActualTypeArguments()[0]); + if (cl == Pointer.class) { + if( type instanceof ResolvedType ) { + io = getPointerInstance(((ResolvedType)type).getTypeParameters().get(0)); + } else { + io = getPointerInstance(((ParameterizedType)type).getActualTypeArguments()[0]); + } + } else if (StructObject.class.isAssignableFrom(cl)) io = getInstance(StructIO.getInstance((Class)cl, type)); else if (Callback.class.isAssignableFrom(cl)) @@ -162,7 +178,11 @@ else if (Callback.class.isAssignableFrom(cl)) else if (NativeObject.class.isAssignableFrom(cl)) io = new CommonPointerIOs.NativeObjectPointerIO(type); else if (IntValuedEnum.class.isAssignableFrom(cl)) { - if (type instanceof ParameterizedType) { + if (type instanceof ResolvedType) { + ResolvedType enumType = ((ResolvedType)type).getTypeParameters().get(0); + io = new CommonPointerIOs.IntValuedEnumPointerIO(enumType.getErasedType()); + } + else if (type instanceof ParameterizedType) { Type enumType = ((ParameterizedType)type).getActualTypeArguments()[0]; if (enumType instanceof Class) io = new CommonPointerIOs.IntValuedEnumPointerIO((Class)enumType); diff --git a/src/test/java/org/bridj/StructFieldDeclarationTest.java b/src/test/java/org/bridj/StructFieldDeclarationTest.java new file mode 100644 index 00000000..8e2128b7 --- /dev/null +++ b/src/test/java/org/bridj/StructFieldDeclarationTest.java @@ -0,0 +1,68 @@ +package org.bridj; + +import java.util.List; + +import org.bridj.ann.Field; +import org.junit.Test; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.CoreMatchers.*; + +public class StructFieldDeclarationTest { + + public static class BasicFieldStruct extends StructObject { + @Field(0) + public int intField; + } + + public static class StaticNestedStruct extends StructObject { + @Field(0) + public BasicFieldStruct structField; + } + + public static class GenericNestedStruct extends StructObject { + @Field(0) + public S structField; + } + + public static class NestedStructOfBasicFieldStruct + extends GenericNestedStruct {} + + @Test + public void testDifferences() { + List legacy = StructFieldDeclaration.listFields(BasicFieldStruct.class); + List resolved = StructFieldDeclaration.listFields2(BasicFieldStruct.class); + + assertThat(resolved.size(), equalTo(legacy.size())); + } + + @Test + public void testStaticNestedStruct() { + List legacy = StructFieldDeclaration.listFields(StaticNestedStruct.class); + List resolved = StructFieldDeclaration.listFields2(StaticNestedStruct.class); + + assertThat(resolved.size(), equalTo(legacy.size())); + + for( int i = 0; i < legacy.size(); i++ ) { + assertThat(resolved.get(i).declaringClass, equalTo(legacy.get(i).declaringClass)); + assertThat(resolved.get(i).valueClass, equalTo(legacy.get(i).valueClass)); + } + } + + @Test + public void testGenericNestedStruct() { + List legacy = StructFieldDeclaration.listFields(NestedStructOfBasicFieldStruct.class); + List resolved = StructFieldDeclaration.listFields2(NestedStructOfBasicFieldStruct.class); + + assertThat(resolved.size(), equalTo(legacy.size())); + + for( int i = 0; i < legacy.size(); i++ ) { + assertThat("declaringClass", resolved.get(i).declaringClass, equalTo(legacy.get(i).declaringClass)); + assertThat("legacyValueClass", legacy.get(i).valueClass, equalTo(StructObject.class)); + assertThat("resolvedValueClass", resolved.get(i).valueClass, equalTo(BasicFieldStruct.class)); + assertThat("index", resolved.get(i).index, equalTo(legacy.get(i).index)); + assertThat("setter", resolved.get(i).setter, equalTo(legacy.get(i).setter)); + assertThat("index", resolved.get(i).unionWith, equalTo(legacy.get(i).unionWith)); + + } + } +} diff --git a/src/test/java/org/bridj/StructGenericsTest.java b/src/test/java/org/bridj/StructGenericsTest.java new file mode 100644 index 00000000..1539626e --- /dev/null +++ b/src/test/java/org/bridj/StructGenericsTest.java @@ -0,0 +1,51 @@ +package org.bridj; + +import static org.bridj.Pointer.getPointer; + +import org.bridj.ann.Field; +import org.junit.Test; +import org.hamcrest.CoreMatchers; +import org.hamcrest.MatcherAssert; + +public class StructGenericsTest { + public static abstract class AbstractStructField> extends StructObject { + @Field(0) + public S getStruct() { + return io.getNativeObjectField(this, 0); + } + + public T setStruct( S struct ) { + io.setNativeObjectField(this, 0, struct); + return (T)this; + } + } + + public static class StructOfInteger extends StructObject { + @Field(0) + public int getField() { + return io.getIntField(this, 0); + } + + public StructOfInteger setField( int field ) { + io.setIntField(this, 0, field); + return this; + } + } + + public static class NestedStructOfInteger + extends AbstractStructField {} + + @Test + public void shouldSupportNestedStructOfPrimative() { + NestedStructOfInteger s = new NestedStructOfInteger(); + s.setStruct(new StructOfInteger().setField(2)); + BridJ.writeToNative(s); + s = getPointer(s).get(); + MatcherAssert.assertThat(s.getStruct().getField(), CoreMatchers.equalTo(2)); + } + + @Test + public void shouldSupportNestedStructs() { + + } +} From 88867c1e8866688e467bf2fa1e42657dbdc8a40b Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Thu, 19 Jan 2017 20:29:53 -0700 Subject: [PATCH 06/11] removed original resolution code --- .../org/bridj/StructFieldDeclaration.java | 131 ------------------ 1 file changed, 131 deletions(-) diff --git a/src/main/java/org/bridj/StructFieldDeclaration.java b/src/main/java/org/bridj/StructFieldDeclaration.java index 1aa5d732..bde898f4 100644 --- a/src/main/java/org/bridj/StructFieldDeclaration.java +++ b/src/main/java/org/bridj/StructFieldDeclaration.java @@ -30,18 +30,9 @@ */ package org.bridj; -import static org.bridj.util.AnnotationUtils.isAnnotationPresent; - -import java.lang.reflect.AnnotatedElement; -import java.lang.reflect.Member; import java.lang.reflect.Method; -import java.lang.reflect.Modifier; import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import org.bridj.ann.Alignment; import org.bridj.ann.Array; @@ -51,13 +42,10 @@ import com.fasterxml.classmate.AnnotationConfiguration; import com.fasterxml.classmate.AnnotationInclusion; -import com.fasterxml.classmate.Filter; import com.fasterxml.classmate.MemberResolver; import com.fasterxml.classmate.ResolvedType; import com.fasterxml.classmate.ResolvedTypeWithMembers; import com.fasterxml.classmate.TypeResolver; -import com.fasterxml.classmate.members.RawField; -import com.fasterxml.classmate.members.RawMethod; import com.fasterxml.classmate.members.ResolvedField; import com.fasterxml.classmate.members.ResolvedMember; import com.fasterxml.classmate.members.ResolvedMethod; @@ -74,21 +62,6 @@ class StructFieldDeclaration { public String toString() { return desc.name + " (index = " + index + (unionWith < 0 ? "" : ", unionWith = " + unionWith) + ", desc = " + desc + ")"; } - - @Deprecated - protected static boolean acceptFieldGetter(Member member, boolean getter) { - if ((member instanceof Method) && ((Method) member).getParameterTypes().length != (getter ? 0 : 1)) { - return false; - } - - if (((AnnotatedElement) member).getAnnotation(Field.class) == null) { - return false; - } - - int modifiers = member.getModifiers(); - - return !Modifier.isStatic(modifiers); - } protected static boolean acceptFieldGetter(ResolvedMember member, boolean getter) { if ((member instanceof ResolvedMethod) && ((ResolvedMethod) member).getRawMember().getParameterTypes().length != (getter ? 0 : 1)) { @@ -101,47 +74,6 @@ protected static boolean acceptFieldGetter(ResolvedMember member, boolean get return !member.isStatic(); } - - /** - * Creates a list of structure fields - */ - @Deprecated - protected static List listFields(Class structClass) { - List list = new ArrayList(); - for (Method method : structClass.getMethods()) { - if (acceptFieldGetter(method, true)) { - StructFieldDeclaration io = fromGetter(method); - try { - // this only works when the names are equal, does not support setXXX methods. - Method setter = structClass.getMethod(method.getName(), io.valueClass); - if (acceptFieldGetter(setter, false)) { - io.setter = setter; - } - } catch (Exception ex) { - //assert BridJ.info("No setter for getter " + method); - } - if (io != null) { - list.add(io); - } - } - } - - int nFieldFields = 0; - for (java.lang.reflect.Field field : structClass.getFields()) { - if (acceptFieldGetter(field, true)) { - StructFieldDeclaration io = StructFieldDeclaration.fromField(field); - if (io != null) { - list.add(io); - nFieldFields++; - } - } - } - if (nFieldFields > 0 && BridJ.warnStructFields) { - BridJ.warning("Struct " + structClass.getName() + " has " + nFieldFields + " struct fields implemented as Java fields, which won't give the best performance and might require counter-intuitive calls to BridJ.readFromNative / .writeToNative. Please consider using JNAerator to generate your struct instead, or use BRIDJ_WARN_STRUCT_FIELDS=0 or -Dbridj.warnStructFields=false to mute this warning."); - } - - return list; - } protected static List listFields2(Class structClass) { List list = new ArrayList(); @@ -216,15 +148,6 @@ protected static ResolvedTypeWithMembers resolveType( Class structClass ) { return mr.resolve(classType, annConfig, null); } - @Deprecated - protected static StructFieldDeclaration fromField(java.lang.reflect.Field getter) { - StructFieldDeclaration field = fromMember((Member) getter); - field.desc.field = getter; - field.desc.valueType = getter.getGenericType(); - field.valueClass = getter.getType(); - return field; - } - protected static StructFieldDeclaration fromField(ResolvedField getter) { StructFieldDeclaration field = fromMember((ResolvedField) getter); field.desc.field = getter.getRawMember(); @@ -232,15 +155,6 @@ protected static StructFieldDeclaration fromField(ResolvedField getter) { field.valueClass = getter.getType().getErasedType(); return field; } - - @Deprecated - protected static StructFieldDeclaration fromGetter(Method getter) { - StructFieldDeclaration field = fromMember((Member) getter); - field.desc.getter = getter; - field.desc.valueType = getter.getGenericReturnType(); - field.valueClass = getter.getReturnType(); - return field; - } protected static StructFieldDeclaration fromGetter(ResolvedMethod getter) { StructFieldDeclaration field = fromMember((ResolvedMember) getter); @@ -250,51 +164,6 @@ protected static StructFieldDeclaration fromGetter(ResolvedMethod getter) { return field; } - @Deprecated - private static StructFieldDeclaration fromMember(Member member) { - StructFieldDeclaration field = new StructFieldDeclaration(); - field.declaringClass = member.getDeclaringClass(); - - String name = member.getName(); - if (name.matches("get[A-Z].*")) { - name = Character.toLowerCase(name.charAt(3)) + name.substring(4); - } - - field.desc.name = name; - - AnnotatedElement getter = (AnnotatedElement) member; - Field fil = getter.getAnnotation(Field.class); - Bits bits = getter.getAnnotation(Bits.class); - Alignment alignment = getter.getAnnotation(Alignment.class); - Array arr = getter.getAnnotation(Array.class); - if (fil != null) { - field.index = fil.value(); - //field.byteOffset = fil.offset(); - field.unionWith = fil.unionWith(); - } - if (field.unionWith < 0 && field.declaringClass.getAnnotation(Union.class) != null) { - field.unionWith = 0; - } - - if (bits != null) { - field.desc.bitLength = bits.value(); - } - if (alignment != null) { - field.desc.alignment = alignment.value(); - } - if (arr != null) { - long length = 1; - for (long dim : arr.value()) { - length *= dim; - } - field.desc.arrayLength = length; - field.desc.isArray = true; - } - field.desc.isCLong = isAnnotationPresent(org.bridj.ann.CLong.class, getter); - field.desc.isSizeT = isAnnotationPresent(org.bridj.ann.Ptr.class, getter); - return field; - } - private static StructFieldDeclaration fromMember(ResolvedMember member) { StructFieldDeclaration field = new StructFieldDeclaration(); field.declaringClass = member.getRawMember().getDeclaringClass(); From 1994d5fdf37a54b820cf131d756837395163c6cc Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Thu, 19 Jan 2017 20:37:43 -0700 Subject: [PATCH 07/11] fixed warnings renamed resolution method to origin name --- src/main/java/org/bridj/StructFieldDeclaration.java | 8 ++++---- src/main/java/org/bridj/StructUtils.java | 2 +- src/test/java/org/bridj/StructFieldDeclarationTest.java | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/bridj/StructFieldDeclaration.java b/src/main/java/org/bridj/StructFieldDeclaration.java index bde898f4..1c8c7c66 100644 --- a/src/main/java/org/bridj/StructFieldDeclaration.java +++ b/src/main/java/org/bridj/StructFieldDeclaration.java @@ -75,7 +75,7 @@ protected static boolean acceptFieldGetter(ResolvedMember member, boolean get return !member.isStatic(); } - protected static List listFields2(Class structClass) { + protected static List listFields(Class structClass) { List list = new ArrayList(); ResolvedTypeWithMembers resolvedStruct = resolveType(structClass); for (ResolvedMethod method : resolvedStruct.getMemberMethods()) { @@ -149,7 +149,7 @@ protected static ResolvedTypeWithMembers resolveType( Class structClass ) { } protected static StructFieldDeclaration fromField(ResolvedField getter) { - StructFieldDeclaration field = fromMember((ResolvedField) getter); + StructFieldDeclaration field = fromMember(getter); field.desc.field = getter.getRawMember(); field.desc.valueType = getter.getType(); field.valueClass = getter.getType().getErasedType(); @@ -157,12 +157,12 @@ protected static StructFieldDeclaration fromField(ResolvedField getter) { } protected static StructFieldDeclaration fromGetter(ResolvedMethod getter) { - StructFieldDeclaration field = fromMember((ResolvedMember) getter); + StructFieldDeclaration field = fromMember(getter); field.desc.getter = getter.getRawMember(); field.desc.valueType = getter.getReturnType(); field.valueClass = getter.getReturnType().getErasedType(); return field; - } + } private static StructFieldDeclaration fromMember(ResolvedMember member) { StructFieldDeclaration field = new StructFieldDeclaration(); diff --git a/src/main/java/org/bridj/StructUtils.java b/src/main/java/org/bridj/StructUtils.java index 792ddc73..01e15031 100644 --- a/src/main/java/org/bridj/StructUtils.java +++ b/src/main/java/org/bridj/StructUtils.java @@ -227,7 +227,7 @@ static Pointer fixIntegralTypeIOToMatchLength(Pointer ptr, long byteLength @SuppressWarnings("deprecation") protected static void computeStructLayout(StructDescription desc, StructCustomizer customizer) { - List fieldDecls = StructFieldDeclaration.listFields2(desc.structClass); + List fieldDecls = StructFieldDeclaration.listFields(desc.structClass); orderFields(fieldDecls); customizer.beforeAggregation(desc, fieldDecls); diff --git a/src/test/java/org/bridj/StructFieldDeclarationTest.java b/src/test/java/org/bridj/StructFieldDeclarationTest.java index 8e2128b7..cebb6f3e 100644 --- a/src/test/java/org/bridj/StructFieldDeclarationTest.java +++ b/src/test/java/org/bridj/StructFieldDeclarationTest.java @@ -30,7 +30,7 @@ public static class NestedStructOfBasicFieldStruct @Test public void testDifferences() { List legacy = StructFieldDeclaration.listFields(BasicFieldStruct.class); - List resolved = StructFieldDeclaration.listFields2(BasicFieldStruct.class); + List resolved = StructFieldDeclaration.listFields(BasicFieldStruct.class); assertThat(resolved.size(), equalTo(legacy.size())); } @@ -38,7 +38,7 @@ public void testDifferences() { @Test public void testStaticNestedStruct() { List legacy = StructFieldDeclaration.listFields(StaticNestedStruct.class); - List resolved = StructFieldDeclaration.listFields2(StaticNestedStruct.class); + List resolved = StructFieldDeclaration.listFields(StaticNestedStruct.class); assertThat(resolved.size(), equalTo(legacy.size())); @@ -51,7 +51,7 @@ public void testStaticNestedStruct() { @Test public void testGenericNestedStruct() { List legacy = StructFieldDeclaration.listFields(NestedStructOfBasicFieldStruct.class); - List resolved = StructFieldDeclaration.listFields2(NestedStructOfBasicFieldStruct.class); + List resolved = StructFieldDeclaration.listFields(NestedStructOfBasicFieldStruct.class); assertThat(resolved.size(), equalTo(legacy.size())); From c7ae5f63ae9806e4d118ac311d83575e93a3bc13 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Thu, 19 Jan 2017 20:49:23 -0700 Subject: [PATCH 08/11] removed tests comparing origin and new resolution code. --- .../org/bridj/StructFieldDeclarationTest.java | 38 ------------------- 1 file changed, 38 deletions(-) diff --git a/src/test/java/org/bridj/StructFieldDeclarationTest.java b/src/test/java/org/bridj/StructFieldDeclarationTest.java index cebb6f3e..45102fbc 100644 --- a/src/test/java/org/bridj/StructFieldDeclarationTest.java +++ b/src/test/java/org/bridj/StructFieldDeclarationTest.java @@ -27,42 +27,4 @@ public static class GenericNestedStruct extends StructOb public static class NestedStructOfBasicFieldStruct extends GenericNestedStruct {} - @Test - public void testDifferences() { - List legacy = StructFieldDeclaration.listFields(BasicFieldStruct.class); - List resolved = StructFieldDeclaration.listFields(BasicFieldStruct.class); - - assertThat(resolved.size(), equalTo(legacy.size())); - } - - @Test - public void testStaticNestedStruct() { - List legacy = StructFieldDeclaration.listFields(StaticNestedStruct.class); - List resolved = StructFieldDeclaration.listFields(StaticNestedStruct.class); - - assertThat(resolved.size(), equalTo(legacy.size())); - - for( int i = 0; i < legacy.size(); i++ ) { - assertThat(resolved.get(i).declaringClass, equalTo(legacy.get(i).declaringClass)); - assertThat(resolved.get(i).valueClass, equalTo(legacy.get(i).valueClass)); - } - } - - @Test - public void testGenericNestedStruct() { - List legacy = StructFieldDeclaration.listFields(NestedStructOfBasicFieldStruct.class); - List resolved = StructFieldDeclaration.listFields(NestedStructOfBasicFieldStruct.class); - - assertThat(resolved.size(), equalTo(legacy.size())); - - for( int i = 0; i < legacy.size(); i++ ) { - assertThat("declaringClass", resolved.get(i).declaringClass, equalTo(legacy.get(i).declaringClass)); - assertThat("legacyValueClass", legacy.get(i).valueClass, equalTo(StructObject.class)); - assertThat("resolvedValueClass", resolved.get(i).valueClass, equalTo(BasicFieldStruct.class)); - assertThat("index", resolved.get(i).index, equalTo(legacy.get(i).index)); - assertThat("setter", resolved.get(i).setter, equalTo(legacy.get(i).setter)); - assertThat("index", resolved.get(i).unionWith, equalTo(legacy.get(i).unionWith)); - - } - } } From d494ad918f8fe4a24c9058cd39935f79806be2d5 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Fri, 20 Jan 2017 01:11:59 -0700 Subject: [PATCH 09/11] moved type resolution code out of struct delcaration class. --- .../org/bridj/StructFieldDeclaration.java | 43 ++++------------- .../org/bridj/StructFieldDescription.java | 6 ++- src/main/java/org/bridj/StructUtils.java | 4 +- src/main/java/org/bridj/util/Methods.java | 19 ++++++++ src/main/java/org/bridj/util/Types.java | 46 +++++++++++++++++++ 5 files changed, 79 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/bridj/util/Methods.java create mode 100644 src/main/java/org/bridj/util/Types.java diff --git a/src/main/java/org/bridj/StructFieldDeclaration.java b/src/main/java/org/bridj/StructFieldDeclaration.java index 1c8c7c66..bff1821d 100644 --- a/src/main/java/org/bridj/StructFieldDeclaration.java +++ b/src/main/java/org/bridj/StructFieldDeclaration.java @@ -39,13 +39,10 @@ import org.bridj.ann.Bits; import org.bridj.ann.Field; import org.bridj.ann.Union; +import org.bridj.util.Methods; +import org.bridj.util.Types; -import com.fasterxml.classmate.AnnotationConfiguration; -import com.fasterxml.classmate.AnnotationInclusion; -import com.fasterxml.classmate.MemberResolver; -import com.fasterxml.classmate.ResolvedType; import com.fasterxml.classmate.ResolvedTypeWithMembers; -import com.fasterxml.classmate.TypeResolver; import com.fasterxml.classmate.members.ResolvedField; import com.fasterxml.classmate.members.ResolvedMember; import com.fasterxml.classmate.members.ResolvedMethod; @@ -53,7 +50,7 @@ class StructFieldDeclaration { final StructFieldDescription desc = new StructFieldDescription(); - Method setter; + ResolvedMethod setter; long index = -1, unionWith = -1;//, byteOffset = -1; Class valueClass; Class declaringClass; @@ -77,15 +74,15 @@ protected static boolean acceptFieldGetter(ResolvedMember member, boolean get protected static List listFields(Class structClass) { List list = new ArrayList(); - ResolvedTypeWithMembers resolvedStruct = resolveType(structClass); + ResolvedTypeWithMembers resolvedStruct = Types.resolveTypeWithInstanceMethods(structClass); for (ResolvedMethod method : resolvedStruct.getMemberMethods()) { if (acceptFieldGetter(method, true)) { StructFieldDeclaration io = fromGetter(method); try { // this only works when the names are equal, does not support setXXX methods. - ResolvedMethod setter = getMethod( resolvedStruct.getMemberMethods(), method.getName(), io.valueClass); + ResolvedMethod setter = Methods.getMethod( resolvedStruct.getMemberMethods(), method.getName(), io.valueClass); if (acceptFieldGetter(setter, false)) { - io.setter = setter.getRawMember(); + io.setter = setter; } } catch (Exception ex) { //assert BridJ.info("No setter for getter " + method); @@ -113,18 +110,6 @@ protected static List listFields(Class structClass) { return list; } - public static ResolvedMethod getMethod( ResolvedMethod[] methods, String name, Class... params ) { - METHODS: for( ResolvedMethod method : methods ) { - if( !name.equals(method.getName()) ) continue METHODS; - if( params.length != method.getArgumentCount()) continue METHODS; - for( int i = 0; i < params.length; i++ ) { - if( !method.getArgumentType(i).isInstanceOf(params[i])) continue METHODS; - } - return method; - } - return null; - } - protected static String nameForMember( ResolvedMember member ) { String name = member.getName(); if (name.matches("get[A-Z].*")) { @@ -136,21 +121,9 @@ protected static String nameForMember( ResolvedMember member ) { } } - protected static ResolvedTypeWithMembers resolveType( Class structClass ) { - TypeResolver resolver = new TypeResolver(); - ResolvedType classType = resolver.resolve(structClass); - MemberResolver mr = new MemberResolver(resolver); - mr.setMethodFilter(method-> - method.getRawMember().getParameterTypes().length < 2 && - !method.isStatic()); - mr.setFieldFilter(field->!field.isStatic()); - AnnotationConfiguration annConfig = new AnnotationConfiguration.StdConfiguration(AnnotationInclusion.INCLUDE_BUT_DONT_INHERIT); - return mr.resolve(classType, annConfig, null); - } - protected static StructFieldDeclaration fromField(ResolvedField getter) { StructFieldDeclaration field = fromMember(getter); - field.desc.field = getter.getRawMember(); + field.desc.field = getter; field.desc.valueType = getter.getType(); field.valueClass = getter.getType().getErasedType(); return field; @@ -158,7 +131,7 @@ protected static StructFieldDeclaration fromField(ResolvedField getter) { protected static StructFieldDeclaration fromGetter(ResolvedMethod getter) { StructFieldDeclaration field = fromMember(getter); - field.desc.getter = getter.getRawMember(); + field.desc.getter = getter; field.desc.valueType = getter.getReturnType(); field.valueClass = getter.getReturnType().getErasedType(); return field; diff --git a/src/main/java/org/bridj/StructFieldDescription.java b/src/main/java/org/bridj/StructFieldDescription.java index 151c2021..e2729eb3 100644 --- a/src/main/java/org/bridj/StructFieldDescription.java +++ b/src/main/java/org/bridj/StructFieldDescription.java @@ -56,6 +56,8 @@ import org.bridj.util.Utils; import com.fasterxml.classmate.ResolvedType; +import com.fasterxml.classmate.members.ResolvedField; +import com.fasterxml.classmate.members.ResolvedMethod; /** * Internal metadata on a struct field @@ -71,9 +73,9 @@ public class StructFieldDescription { public long bitMask = -1; public boolean isArray, isNativeObject; public Type nativeTypeOrPointerTargetType; - public java.lang.reflect.Field field; + public ResolvedField field; Type valueType; - Method getter; + ResolvedMethod getter; String name; boolean isCLong, isSizeT; diff --git a/src/main/java/org/bridj/StructUtils.java b/src/main/java/org/bridj/StructUtils.java index 01e15031..d3a91841 100644 --- a/src/main/java/org/bridj/StructUtils.java +++ b/src/main/java/org/bridj/StructUtils.java @@ -158,9 +158,9 @@ static String describe(StructObject struct, Type structType, StructFieldDescript try { Object value; if (fd.getter != null) { - value = fd.getter.invoke(struct); + value = fd.getter.getRawMember().invoke(struct); } else { - value = fd.field.get(struct); + value = fd.field.getRawMember().get(struct); } if (value instanceof String) { diff --git a/src/main/java/org/bridj/util/Methods.java b/src/main/java/org/bridj/util/Methods.java new file mode 100644 index 00000000..e953c769 --- /dev/null +++ b/src/main/java/org/bridj/util/Methods.java @@ -0,0 +1,19 @@ +package org.bridj.util; + +import com.fasterxml.classmate.members.ResolvedMethod; + +public class Methods { + + public static ResolvedMethod getMethod( ResolvedMethod[] methods, String name, Class... params ) { + METHODS: for( ResolvedMethod method : methods ) { + if( !name.equals(method.getName()) ) continue METHODS; + if( params.length != method.getArgumentCount()) continue METHODS; + for( int i = 0; i < params.length; i++ ) { + if( !method.getArgumentType(i).isInstanceOf(params[i])) continue METHODS; + } + return method; + } + return null; + } + +} diff --git a/src/main/java/org/bridj/util/Types.java b/src/main/java/org/bridj/util/Types.java new file mode 100644 index 00000000..4279c342 --- /dev/null +++ b/src/main/java/org/bridj/util/Types.java @@ -0,0 +1,46 @@ +package org.bridj.util; + +import com.fasterxml.classmate.AnnotationConfiguration; +import com.fasterxml.classmate.AnnotationConfiguration.StdConfiguration; +import com.fasterxml.classmate.AnnotationInclusion; +import com.fasterxml.classmate.MemberResolver; +import com.fasterxml.classmate.ResolvedType; +import com.fasterxml.classmate.ResolvedTypeWithMembers; +import com.fasterxml.classmate.TypeResolver; + +/** + * Static utilities for resolving types. + * + * @author Christian Trimble + * + */ +public class Types { + static final TypeResolver resolver = new TypeResolver(); + + public static TypeResolver getResolver() { + return resolver; + } + + public static ResolvedTypeWithMembers resolveTypeWithInstanceMethods( Class unresolved ) { + return resolveTypeWithInstanceMethods(resolver.resolve(unresolved)); + } + + public static ResolvedTypeWithMembers resolveTypeWithInstanceMethods( ResolvedType resolvedType ) { + MemberResolver mr = new MemberResolver(resolver); + mr.setMethodFilter(method->!method.isStatic()); + mr.setFieldFilter(field->!field.isStatic()); + AnnotationConfiguration annConfig = new AnnotationConfiguration.StdConfiguration(AnnotationInclusion.INCLUDE_BUT_DONT_INHERIT); + return mr.resolve(resolvedType, annConfig, null); + } + + public static ResolvedTypeWithMembers resolveTypeWithNativeMethods( Class unresolved ) { + return resolveTypeWithNativeMethods(resolver.resolve(unresolved)); + } + public static ResolvedTypeWithMembers resolveTypeWithNativeMethods( ResolvedType resolvedType ) { + MemberResolver mr = new MemberResolver(resolver); + mr.setMethodFilter(method->method.isNative()); + mr.setFieldFilter(field->false); + AnnotationConfiguration annConfig = new AnnotationConfiguration.StdConfiguration(AnnotationInclusion.INCLUDE_BUT_DONT_INHERIT); + return mr.resolve(resolvedType, annConfig, null); + } +} From 2cec0c1d133e426fcc8df58582814b8c816ba30a Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Fri, 20 Jan 2017 01:39:19 -0700 Subject: [PATCH 10/11] added source declaration to the javadoc plugin --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index ef97e70b..0cbadc49 100644 --- a/pom.xml +++ b/pom.xml @@ -371,6 +371,7 @@ jar + ${maven.compiler.source} Core Packages From cbe4a42897c6948ef42ab2f6588dfd4117447606 Mon Sep 17 00:00:00 2001 From: Christian Trimble Date: Fri, 20 Jan 2017 01:39:44 -0700 Subject: [PATCH 11/11] SQUASH: added missing StructIO changes to resolver refactoring --- src/main/velocity/org/bridj/StructIO.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/velocity/org/bridj/StructIO.java b/src/main/velocity/org/bridj/StructIO.java index 7a6394c7..e07e7a6b 100644 --- a/src/main/velocity/org/bridj/StructIO.java +++ b/src/main/velocity/org/bridj/StructIO.java @@ -131,14 +131,14 @@ public final void writeFieldsToNative(StructObject struct) { if (fd.isArray) continue; - Object value = fd.field.get(struct); + Object value = fd.field.getRawMember().get(struct); if (value instanceof NativeObject) {//fd.isNativeObject) { if (value != null) BridJ.writeToNative((NativeObject)value); continue; } Pointer ptr = struct.peer.offset(fd.byteOffset); - Type tpe = fd.isNativeObject || fd.isArray ? fd.nativeTypeOrPointerTargetType : fd.field.getGenericType(); + Type tpe = fd.isNativeObject || fd.isArray ? fd.nativeTypeOrPointerTargetType : fd.field.getType(); ptr = ptr.as(tpe); ptr = fixIntegralTypeIOToMatchLength(ptr, fd.byteLength, fd.arrayLength); @@ -166,7 +166,7 @@ public final void readFieldsFromNative(StructObject struct) { continue; Pointer ptr = struct.peer.offset(fd.byteOffset); - Type tpe = fd.isNativeObject || fd.isArray ? fd.nativeTypeOrPointerTargetType : fd.field.getGenericType(); + Type tpe = fd.isNativeObject || fd.isArray ? fd.nativeTypeOrPointerTargetType : fd.field.getType(); ptr = ptr.as(tpe); ptr = fixIntegralTypeIOToMatchLength(ptr, fd.byteLength, fd.arrayLength); Object value; @@ -176,7 +176,7 @@ public final void readFieldsFromNative(StructObject struct) { } else { value = ptr.get(); } - fd.field.set(struct, value); + fd.field.getRawMember().set(struct, value); if (value instanceof NativeObject) {//if (fd.isNativeObject) { if (value != null)