Each platform has its nuances and "perfect" implementation will be limited to the least common denominator between all platforms. Low-level and hardware-specific needs are best addressed natively. However web-based frameworks like Sencha Touch or jqTouch do a good job if you merely want users to submit/receive content.
Sencha Touch is built for iOS and Android and the 1.1 version of the framework now supports BlackBerry 6. These apps are written in Javascript and can be published as regular mobile websites (*in webkit browsers) or wrapped in PhoneGap as pseudo-"native" apps. In the iOS case, this buys you the option of putting the app on the App Store.
Appcelerator's Titanium is another Javascript-based solution cross-compiled into the native language of your choice.
Another option to consider is Adobe flash/flex/air. You can write once and publish to many platforms, web, or the device of your choice.
Just remember that all of these cross-compiler and multi-platform solutions come at a cost. You get more platforms for the price of developing once (plus learning the framework and adapting for the "nuances" of each target), but your app may not seem as "polished" or have access to as many slick features native apps enjoy. Something to think about.
best Of luck in your Mobile endeavorS.