@@ -1594,7 +1594,7 @@ public VariablesDeclaration convertVariablesDeclarationToJNA(String name, TypeRe
15941594 mul = expr (c .getFirst (), BinaryOperator .Multiply , mul );
15951595 }
15961596 }
1597- initVal = new Expression .NewArray (jr .getTarget (), mul );
1597+ initVal = new Expression .NewArray (jr .getTarget (), new Expression [] { mul }, new Expression [ 0 ] );
15981598 }
15991599 if (javaType == null ) {
16001600 throw new UnsupportedConversionException (mutatedType , "failed to convert type to Java" );
@@ -1963,24 +1963,29 @@ private void addStructConstructors(Identifier structName, Struct structJavaClass
19631963 Pair <List <VariablesDeclaration >, List <VariablesDeclaration >> decls = getParentAndOwnDeclarations (structJavaClass , nativeStruct );
19641964 Map <Integer , String > namesById = new TreeMap <Integer , String >();
19651965 Set <String > names = new HashSet <String >();
1966+ List <Expression > orderedFieldNames = new ArrayList <Expression >();
19661967 int iArg = 0 ;
19671968 for (VariablesDeclaration vd : new CompoundCollection <VariablesDeclaration >(decls .getFirst (), decls .getSecond ())) {
19681969 String name = chooseJavaArgName (vd .getDeclarators ().get (0 ).resolveName (), iArg , names );
19691970 namesById .put (vd .getId (), name );
19701971 fieldsConstr .addArg (new Arg (name , vd .getValueType ().clone ()));
19711972 iArg ++;
19721973 }
1974+
19731975 FunctionCall superCall = methodCall ("super" );
1976+ // Adding parent fields
19741977 for (VariablesDeclaration vd : decls .getFirst ()) {
19751978 String name = vd .getDeclarators ().get (0 ).resolveName (), uname = namesById .get (vd .getId ());
19761979 Struct parent = (Struct )vd .getParentElement ();
19771980 Identifier parentTgName = result .getTaggedTypeIdentifierInJava (parent );
19781981 if (!result .config .noComments )
19791982 fieldsConstr .addToCommentBefore ("@param " + name + " @see " + parentTgName + "#" + vd .getDeclarators ().get (0 ).resolveName ());
19801983 superCall .addArgument (varRef (uname ));
1984+ orderedFieldNames .add (expr (name ));
19811985 }
19821986 fieldsConstr .getBody ().addStatement (stat (superCall ));
19831987
1988+ // Adding class' own fields
19841989 for (VariablesDeclaration vd : decls .getSecond ()) {
19851990 String name = vd .getDeclarators ().get (0 ).resolveName (), uname = namesById .get (vd .getId ());
19861991 if (!result .config .noComments )
@@ -1990,7 +1995,25 @@ private void addStructConstructors(Identifier structName, Struct structJavaClass
19901995 fieldsConstr .getBody ().addStatement (throwIfArraySizeDifferent (uname ));
19911996 fieldsConstr .getBody ().addStatement (stat (
19921997 new Expression .AssignmentOp (memberRef (thisRef (), MemberRefStyle .Dot , ident (name )), AssignmentOperator .Equal , varRef (uname ))));
1998+
1999+ orderedFieldNames .add (expr (name ));
19932000 }
2001+
2002+ if (result .config .runtime != JNAeratorConfig .Runtime .BridJ ) {
2003+ String initOrderName = "initFieldOrder" ;
2004+ Function initOrder = new Function (Type .JavaMethod , ident (initOrderName ), typeRef (Void .TYPE )).setBody (block (
2005+ stat (
2006+ methodCall ("setFieldOrder" , new Expression .NewArray (typeRef (String .class ), new Expression [0 ], orderedFieldNames .toArray (new Expression [orderedFieldNames .size ()])))
2007+ )
2008+ )).addModifiers (Modifier .Protected );
2009+ if (signatures .add (initOrder .computeSignature (false ))) {
2010+ structJavaClass .addDeclaration (initOrder );
2011+ Statement callInitOrder = stat (methodCall (initOrderName ));
2012+ emptyConstructor .getBody ().addStatement (callInitOrder );
2013+ fieldsConstr .getBody ().addStatement (callInitOrder .clone ());
2014+ }
2015+ }
2016+
19942017 int nArgs = fieldsConstr .getArgs ().size ();
19952018 if (nArgs == 0 )
19962019 System .err .println ("Struct with no field : " + structName );
0 commit comments