You should provide a hexdump if there is any chance to decipher the input.
The flatbuffer header has a 4 byte offset to the first table and an optional 4 byte ASCII identifier like "MONS" for monster data.
But the Java buffer is wrong in several ways:
The string 65 65 65 66 66 66 (= "AAABBBB") is not zero terminated in the java version and is also missing the last B, but the length is 7 as it should be.
The first 4 bytes in the buffer is the offset to the table start. In C++ this is at byte offset 36 which is reasonable. In Java it is 52 * 256 + 28, which is way outside the buffer and cannot be right. The buffer is probably missing the initial 8 byte header (4 bytes offset and 4 bytes identifier - although the identifier is optional).
The 28 at offset 8 in C++ and at offset 0 in Java is the vtable length (12 fields of size 2 each, and two header fields of size 2 yields 28).
The next number is 56 in C and 52 in Java. This is the tables data size. Depending on how data is stored the table may be smaller or larger due to alignment, so this is probably fine.
After 56 or 52 follows 12 16 bit entries in the vtable with offsets into the table. These are different in C++ because the order of the values stored are different. But this is perfectly fine as along as all values are aligned correctly.
After the 28 vtable bytes follows the table in Java. You can see the 28 value again which indicates the vtable starts 28 bytes earlier. However, this offset is 4 bytes long (table header), so you have 28 0 0 48. But 48 is not correct. It should have been 0. 48 might be the offset to the AAABBBB string, but it is one byte too early.
If you had a 16 byte per line hexdump it would be much easier to see.
The C++ buffer shows unsigned bytes and Java shows signed bytes, but table values are probably the same when converted.
BTW: Please refer to the C++ buffer as C++ and not C. There is a separate generator for C and it uses a different layout storing vtables at then end when possible.