My observation from inspecting the object in the debugger is that it's an AbstractBlock in both cases. I guess when the Ruby object comes in through the Java API, it gets wrapped automatically in some sort of internal proxy. But that mapping seems to be different from when you create an AbstractBlock from the Java side.

I think this is probably a good opportunity for an isolated test that focuses specifically on how blocks are created so we can better understand the problem separate from the extension code.