diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 944fba9..ed7bc41 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 3.2.6
+
+* [java] Fixes returning int values from FlutterApi methods that fit in 32 bits.
+
 ## 3.2.5
 
 * [c++] Fixes style issues in `FlutterError` and `ErrorOr`. The names and
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 282e6f7..2200c08 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -9,7 +9,7 @@
 import 'ast.dart';
 
 /// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '3.2.5';
+const String pigeonVersion = '3.2.6';
 
 /// Read all the content from [stdin] to a String.
 String readStdin() {
diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart
index c155482..ae1f539 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -376,7 +376,13 @@
           } else {
             const String output = 'output';
             indent.writeln('@SuppressWarnings("ConstantConditions")');
-            indent.writeln('$returnType $output = ($returnType)channelReply;');
+            if (func.returnType.baseName == 'int') {
+              indent.writeln(
+                  '$returnType $output = channelReply == null ? null : ((Number)channelReply).longValue();');
+            } else {
+              indent
+                  .writeln('$returnType $output = ($returnType)channelReply;');
+            }
             indent.writeln('callback.reply($output);');
           }
         });
diff --git a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
index eabdb5f..d1f3fb1 100644
--- a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
+++ b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
@@ -30,7 +30,16 @@
               message.position(0);
               ArrayList<Object> args =
                   (ArrayList<Object>) PrimitiveFlutterApi.getCodec().decodeMessage(message);
-              ByteBuffer replyData = PrimitiveFlutterApi.getCodec().encodeMessage(args.get(0));
+              Object arg = args.get(0);
+              if (arg instanceof Long) {
+                Long longArg = (Long) arg;
+                if (longArg.intValue() == longArg.longValue()) {
+                  // Value fits in the Integer so gets sent as such
+                  // https://docs.flutter.dev/development/platform-integration/platform-channels?tab=type-mappings-java-tab#codec
+                  arg = Integer.valueOf(longArg.intValue());
+                }
+              }
+              ByteBuffer replyData = PrimitiveFlutterApi.getCodec().encodeMessage(arg);
               replyData.position(0);
               reply.reply(replyData);
               return null;
@@ -55,6 +64,20 @@
   }
 
   @Test
+  public void primitiveLongInt() {
+    BinaryMessenger binaryMessenger = makeMockBinaryMessenger();
+    PrimitiveFlutterApi api = new PrimitiveFlutterApi(binaryMessenger);
+    boolean[] didCall = {false};
+    api.anInt(
+        1L << 50,
+        (Long result) -> {
+          didCall[0] = true;
+          assertEquals(result.longValue(), 1L << 50);
+        });
+    assertTrue(didCall[0]);
+  }
+
+  @Test
   public void primitiveIntHostApi() {
     PrimitiveHostApi mockApi = mock(PrimitiveHostApi.class);
     when(mockApi.anInt(1L)).thenReturn(1L);
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 03df4b6..2341d0a 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
 repository: https://github.com/flutter/packages/tree/main/packages/pigeon
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
-version: 3.2.5 # This must match the version in lib/generator_tools.dart
+version: 3.2.6 # This must match the version in lib/generator_tools.dart
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index ba076fd..b42eed7 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -836,6 +836,32 @@
     expect(code, contains('List<Long> output ='));
   });
 
+  test('flutter int return', () {
+    final Root root = Root(
+      apis: <Api>[
+        Api(name: 'Api', location: ApiLocation.flutter, methods: <Method>[
+          Method(
+              name: 'doit',
+              returnType:
+                  const TypeDeclaration(baseName: 'int', isNullable: false),
+              arguments: <NamedType>[],
+              isAsynchronous: true)
+        ])
+      ],
+      classes: <Class>[],
+      enums: <Enum>[],
+    );
+    final StringBuffer sink = StringBuffer();
+    const JavaOptions javaOptions = JavaOptions(className: 'Messages');
+    generateJava(javaOptions, root, sink);
+    final String code = sink.toString();
+    expect(code, contains('doit(Reply<Long> callback)'));
+    expect(
+        code,
+        contains(
+            'Long output = channelReply == null ? null : ((Number)channelReply).longValue();'));
+  });
+
   test('host multiple args', () {
     final Root root = Root(apis: <Api>[
       Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
