private void WriteDestroyStructMethod(StructGenerationInfo @struct) { BeginJniMethod(JniType.Void, @struct.JavaType.RawName, @struct.DestroyStructMethodName, true, new MethodParameter <JniType>[] { new(JniType.JLong, "handle") });
private void WriteAllocateStructMethod(StructGenerationInfo @struct) { BeginJniMethod(JniType.JLong, @struct.JavaType.RawName, @struct.AllocateStructMethodName, true, Array.Empty <MethodParameter <JniType> >()); WriteIndentedLine($"return FumoCement::toJavaPointer(new {@struct.NativeName});"); EndJniMethod(); }
private void GenerateStruct(StructGenerationInfo @struct) { var className = @struct.JavaName; WriteIndentedLine($"public static final class {className} extends NativeStruct"); WriteBlockStart(); WriteIndentedLine($"public static native long {@struct.AllocateStructMethodName}();"); WriteIndentedLine($"public static native void {@struct.DestroyStructMethodName}(long handle);"); WriteNewLine(); WriteIndentedLine($"public static native void {@struct.OverwriteMethodName}(" + $"@Pointer(\"{@struct.NativeName}*\") long targetHandle, " + $"@Pointer(\"{@struct.NativeName}*\") long dataHandle);"); WriteIndentedLine($"private static final NativeObjectTracker<{className}> ownedTracker = " + $"new NativeObjectTracker<>({className}::new, NativeObjectTracker.Target.OWNED_OBJECTS);"); WriteIndentedLine($"private static final NativeObjectTracker<{className}> unownedTracker = " + $"new NativeObjectTracker<>({className}::new, NativeObjectTracker.Target.UNOWNED_OBJECTS);"); WriteNewLine(); WriteIndentedLine($"public static {className} createTracked()"); WriteBlockStart(); WriteIndentedLine("return ownedTracker.getOrCreate(allocateStruct());"); WriteBlockEnd(); WriteNewLine(); WriteIndentedLine($"public static {className} getTrackedAndOwned(long handle)"); WriteBlockStart(); WriteIndentedLine("return ownedTracker.getOrCreate(handle);"); WriteBlockEnd(); WriteNewLine(); WriteIndentedLine($"public static {className} getTrackedAndUnowned(long handle)"); WriteBlockStart(); WriteIndentedLine("return unownedTracker.getOrCreate(handle);"); WriteBlockEnd(); WriteNewLine(); WriteIndentedLine($"public {className}()"); WriteBlockStart(); WriteIndentedLine($"super(allocateStruct(), true, {className}::destroyStruct);"); WriteBlockEnd(); WriteNewLine(); WriteIndentedLine($"public {className}(long handle, boolean isOwned)"); WriteBlockStart(); WriteIndentedLine($"super(handle, isOwned, {className}::destroyStruct);"); WriteBlockEnd(); WriteIndentedLine($"public {className}(long handle, boolean isOwned, DisposalMethod disposalMethod)"); WriteBlockStart(); WriteIndentedLine($"super(handle, isOwned, disposalMethod, {className}::destroyStruct);"); WriteBlockEnd(); WriteNewLine(); WriteIndentedLine($"public void overwrite(@Pointer(\"{@struct.NativeName}*\") long dataHandle)"); WriteBlockStart(); WriteIndentedLine("overwrite(getHandle(), dataHandle);"); WriteBlockEnd(); foreach (var field in @struct.Fields) { WriteNewLine(); WriteStructFieldGetter(field); WriteStructFieldSetter(field); } WriteBlockEnd(); }