"Next task: create a JNI lib that can access Mono... should be fairly easy." Famous last words. I guess I didn't think through the problem of Android using a non-standard linker. Not only is it named and located differently (/system/bin/linker as opposed to ld-linux.so.3), the format of the dynamic libraries it loads is also different as well. So, Android's linker can not load Linux .so files, and vice versa.
This basically means that Mono with its current build configuration can not interact with the Android system at all, other than through RPC. And while it certainly is possible to do that (and Android uses RPC extensively), I feel that would be a clumsy solution, as my goal is to get Mono running side by side with Java/Dalvik, and allow seamless interaction with runtime through usage of Dynamic Language Runtime (I'm not sure if Mono supports the "dynamic" keyword/type yet, but when it does... this will be quite amazing).
There are two possible solutions to this:
- Recompile Mono and the glibc dependencies using the linker script for Android.
- Compile Mono within the Android build environment so it uses Bionic instead of libc.
Using Crosstool, I tried to build a new toolchain tailored for Android's linker. I quickly found that whoever set up the toolchain/glibc build process must be a sadist. I wasn't too hesitant to give up on this approach anyway: this would result in two copies of libc being loaded (if that is even possible).
Although getting Mono fully integrated to work with Android's libraries will take considerably longer, I can rest knowing it is the proper solution.
 Set up an RPC server for OpenGL ES or skia? Ugh...