Of course, the sticking point in this is it doesn't work on iOS apparently (as reported by a Unity3D user), because you can't dynamically load DLLs or something, so they're still using an older version of the library which used static DLL Imports for the P/invoke. I'm digressing, but the point is interop is hard and tricky, but C# offers a lot of nice solutions where you don't go bat-crazy and want to pull your hair out just to do some simple interop.
When the developer calls a native library from C#, that is all well and good but getting that native binary to call back to the managed runtime is a nightmare (with really messy function pointer passing and datatype marshaling).
The Java JNI is pretty easy to call a native library (just tag a (admittedly long) function name as native). Where it really stands out is that the native library can then include "jni.h" (and link against libjni implicitly by the Android build system) and use a whole host of reflection functionality to call back. This is the reason why Unity cloned the JNI API (for their Android exporter) rather than rewriting it with a different API.
Honestly, on Android, I would just use Java to set up a basic rendering context and then go entirely native and use OpenGL for the rest of the game (with small platform specific calls (i.e to load an image). Better still, use NativeActivity and stick with C or C++ entirely. At least then, that same C or C++ code can be used on every platform (including HTML5 web pages with Emscripten) with minimal modification.