【月入41万】Mono For Android中使用百度地图SDK

cownew 2013-06-18 11:11:00
加精
借助于Mono For Android技术,.Net开发者也可以使用自己熟悉的C#语言以及.Net来开发Android应用。由于Mono For Android把Android SDK中绝大部分类库都已经实现,基本直接参考Java开发Android的书就可以掌握Mono for android技术。

对于有项目技术决策权的团队,如果项目组成员对Java不熟悉,那么可以使用自己熟悉的.Net来开发Android应用,比如我的一个学生使用Mono For Android开发了一款应用(应学生要求,应用的名字保密),3月份一个月就入账41万元。当然是否赚钱和工具关系不大,这里贴出这个案例只是为了告诉大家:Mono For Android是可以完成你的需求的。下图是这位同学的支付宝收款账单:



对于想学习Java开发Android的开发者,也可以把Mono For Android当作学习过渡工具,因为Mono For Android和Java进行Android开发几乎只是大小写等命名规则的不同而已,其他几乎都是一模一样的。因此我在黑马程序员训练营和传智播客的.Net培训班中加入了Mono For Android开发课程。

有一个非常重要的问题,做Android开发的时候还会使用一些第三方的jar包。jar是java的技术,那么在Mono for android中需要怎样使用这些jar呢? 需要一个把jar绑定到dll的过程。

下面以一个典型的Mono For android调用百度地图sdk来讲解一下这个过程:

第一步:创建jar的绑定程序集

Mono for android提供了Java Binding Library用来自动化的创建绑定(或者说包装)jar的.Net程序集,这样就可以通过调用程序集中的包装类来调用jar中的类了。

首先从百度地图网站上下载百度地图的SDK;

接着在Visual Studio的点击主菜单【文件】→【新建】→【项目】,在对话框中选择Mono for Android下的“Java Binding Library”,给项目取一个名字,比如“BaiduMapSDK”;

接下来把baidumapapi_v2_1_1.jar放到Jars文件夹下,选中jar文件,在属性视图中将“生成操作”属性设置为“EmbeddedJar”,生成解决方案。我们就会发现在bin/Debug文件夹下就生成了BaiduMapSDK.dll这个包装程序集,细心的朋友应该发现了在obj\Debug\generated\src下生成的cs代码就是对jar的封装调用。

第二步:引用绑定程序集

点击主菜单【文件】→【新建】→【项目】,在对话框中选择Mono for Android下的“Android Application”创建一个Android项目,比如取名为“MapTest”。

在项目上点右键选择【添加引用】→【项目】,在项目列表中选择第一步创建的“BaiduMapSDK”。

如果是普通的全部都是用java代码写的jar,那么这样就可以用了,但是百度地图SDK中是包含使用C/C++写的Native代码(如果SDK包中除了jar文件之外还有.so文件,那么就说明有一部分代码是非Java的Native代码)的,因此还需要把libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so这两个库文件放到MapTest项目中,并且把so文件的“生成操作”设置为“AndroidNativeLibrary”,否则运行的时候会提示加载不到Library。

在MapTest项目中创建一个libs文件夹,并且在libs文件夹下创建一个armeabi文件夹,然后把libapp_BaiduMapApplib_v2_1_1.so、libvi_voslib.so放到这个文件夹下。如果运行到armeabi-v7a CPU下,还需要同样创建一份armeabi-v7a文件夹;同样如果运行在x86CPU下则同样需要创建x86文件夹(但是百度地图SDK的so暂时不支持X86CPU)。

第三步:调用百度地图SDK

在axml中添加地图视图控件:MapView

<com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:clickable="true" />



反编译BaiduMapSDK.dll我们会发现,这个程序集中把命名空间、类名、方法名等都改成了.Net的命名规则,比如MapView类在java中的包名是com.baidu.mapapi.map,但是在dll程序集中命名空间变成了Com.Baidu.Mapapi.Map(首字母大写)。



因为layout文件是给android引擎使用的,而程序集中的类只是对java类的的包装,所以注意在layout文件中控件节点的命名空间要使用java中的命名规则com.baidu.mapapi.map.MapView,而不是Com.Baidu.Mapapi.Map.MapView。



在Activity的OnCreate中SetContentView之前添加下面的代码来初始化百度地图SDK,否则会报错“com.baidu.platform.comjni.map.basemap.JNIBaseMap.Create”:

BMapManager mBMapMan = new BMapManager(this.Application);

mBMapMan.Init("我的Key", null);



注意把“我的Key”替换成从百度地图网站上申请的应用Key。

当然还没有结束,因为还需要增加百度地图SDK需要的权限,至少添加如下的权限:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />



程序运行之后百度地图就显示出来了。



当然如果仔细查看生成的DLL,你可能会发现所有的方法的参数名字全部都是p0、p1、p2,而不是有意义的参数名。

这是怎么回事呢?不像.Net的MSIL中把参数名也写入了IL代码,Java中方法名是没有写入.class 的,因此工具也无法通过jar文件分析出参数的名字,所以“Java Binding Library”生成的程序集的方法的参数名都是p0、p1、p2这样无意义的参数名,能否命名为有意义的参数名呢?关于这个问题可以参考官方文档《Binding a Java Library (.jar),Consuming Java Libraries from C#》 中“Fixing Up Parameter Names”这段内容,里面提到了可以编辑Metadata.xml文件来为参数取名字。

但是这个为参数命名的过程很枯燥,按理来说,如果我们拿到了jar对应的java源文件,那么Mono For Android应该可以根据java源代码来知道参数的名字,但是貌似这个还没有实现。我有一个思路,使用Eclipse的JDT中的Java源码分析类ASTParser(用法参考:http://lym6520.iteye.com/blog/747840 和http://blog.csdn.net/flying881114/article/details/6187503 )来分析jar对应的java源文件,然后自动生成Metadata.xml文件。工作很忙,暂时没时间实现这个想法,希望有园子里的大牛能实现,造福广大Monoer!
...全文
12079 148 打赏 收藏 转发到动态 举报
写回复
用AI写文章
148 条回复
切换为时间正序
请发表友善的回复…
发表回复
acefd 2014-07-21
  • 打赏
  • 举报
回复
我擦很牛逼啊
C_sharp_初学者 2014-07-04
  • 打赏
  • 举报
回复
杨老师你好,我是一名刚开始接触mono的新人,借鉴了这篇文章顺利的使用上了百度地图SDK,但是在定位的时候出现了问题
按照百度官方demo的示例,建立MyLocationListenner实现接口IBDLocationListener(JAVA里是BDLocationListener)
但是会有public IntPtr Handle这个本定义在IJavaObject里的字段(IBDLocationListener继承与IJavaObject)



由于不知道handle如何获取,我返回了空值,于是在定位时因为handle为空报错了


所以想请问您是否遇到过类似的问题,改如何解决?
adofu2008 2014-03-23
  • 打赏
  • 举报
回复
杨老师讲的.NET培训课程我从网上下载下来看了一下,讲的非常好,很多东西讲的透彻,建议初学.NET的从网上先下载下来听听。很经典的。在这里顶一下杨老师
太相 2014-03-04
  • 打赏
  • 举报
回复
awesome
hou_kui 2014-02-24
  • 打赏
  • 举报
回复
越到后面发现马甲越多
  • 打赏
  • 举报
回复
老杨一个月给你多少,该不会是本人吧
AIMKK 2014-02-21
  • 打赏
  • 举报
回复
谁想赚谁赚,
大湿级 2014-02-20
  • 打赏
  • 举报
回复
引用
传智0420学员
呵呵,狗日的培训机构骗学生
General_Y 2014-02-14
  • 打赏
  • 举报
回复
你好,请问生成Java Binding Library项目时报错错误 “VersionInfo”: 成员名称不能与它们的封闭类型相同 。请问如何解决
jiaoshiyao 2014-01-09
  • 打赏
  • 举报
回复
做广告的应该直接封号
weixin_13570895778 2013-12-22
  • 打赏
  • 举报
回复
杨老师,我按您的方法,加入一个jar的包,是一个视频SDK,生成DLL,obj下确实有转换的代码,为何引用这个DLL时,就看不里面有什么代码?765877694@qq.com 麻烦回个邮件,指导一下
e188665817 2013-10-24
  • 打赏
  • 举报
回复
打错字 上面的是 不厌其烦 太激动。。。还有 如果这帖子杨老师能看到 我想提点建议。。内啥 虽然我没交学费啥的,但是 我还是真心的学校能越办越好,建议就是 希望以后上课的视频 可以细致 再细致一些。。。很多老师的课。。视频是各种混乱。。就算是用来复习。。时间久了回头看 也根本是不知所云。。补充一句 苏坤苏老师也是牛人 很幽默 讲课也很细致。 祝传智越办越红火
e188665817 2013-10-24
  • 打赏
  • 举报
回复
想说句公道话。。又怕被人喷出翔 说我是什么托。。可我还是想说。。老杨 杨老师搞的传智是真心不错。。坛子上肯定有大牛,但也请您别牛气哄哄。。。我小白一个,由于上海的传智没有.net班 我是想尽了办法,通过各种渠道找到了学生上课录的视频在学习,纯属自学,传智的课已经伴随了我大半年,虽然只有3个月的课程 ,可自学好难,那我也坚持到现在,因为他们的课 录制的视频是真的细致,跟着学习是真的学到了很多,以至于现在一提传智都有种莫名的感情,因为邹华栋邹老师的课给我留下的印象太深刻了,真心话,我看的视频,虽然视频有些地方不连贯,但也不影响邹老师用心讲的每一节课,每个知识点只要有学生不懂 他就一遍遍的讲 ,甚至有时候我都能听到视频里面的学生不耐烦 ,那也不行,只要学生不会,他就会不耐其烦的讲,直到所有人都懂了才会往下继续,就算是视频我都觉得挺感动的,别的讲师不是不好 也许是视频录制上面稍微马虎,但邹老师在每一个知识点上都分开录制方便后面做复习用,因为学校在上海没有.net班 也没办法 也不知道怎么能联系到邹老师,那就在这道声谢吧,也不知道能不能听到,希望老杨 杨老师看到了帮忙转达一下“谢了 邹老师 你的课伴了我将近3个月 真的学到不少东西 !感谢你为学生付出的那么多!” 最后我有个想法,就是无论今年是否能学有所成 如果传智在上海的.net开班 再如果 邹老师能够来上海 , 我是无论如何 说什么也要到现场去听一回课 再次感谢邹老师 和其他老师还有老杨 ,因为传智课的视频 帮助不知道多少想用心学习的人 !(虽然学校的初衷是给毕业的同学做复习,而不是免费教学,但。。。呵呵呵呵呵 原谅我的剽窃行为,因为我真的是很想学习 又没有好的学习资料 杨老师请原谅!) 最最最最后, 强烈要求老杨给邹老师加工资!!!! 说完了。。。顺带一句 我是看到这篇帖子那么多人在喷 特意将很久之前注册的号翻出来 又用邮箱找回了密码 登录之后 用了差不多十分钟的时间 写的这篇帖子 可以说是每个字都发自内心,如果有人再说我是托。。我只能说 喷子你好,喷子再见,喷子请滚粗!
tjczxiaofei 2013-10-08
  • 打赏
  • 举报
回复
渃水 2013-09-30
  • 打赏
  • 举报
回复
这个广告打的有点掉价啊,以前看视频的时候还蛮支持杨老师的
Lizy0606 2013-09-26
  • 打赏
  • 举报
回复
这个帖子过多的评价不说,好的自然好,不好的自然不好。好的APP不用过多的夸张说辞即可完善用户。笑过就好,但是看了一下LZ回复大家网友的评论,攻击性词语太多。不符合逻辑。不管是网络营销还是口碑营销。说好的自然就有说不好的。接受大家的建议,你的APP才会做的越来越好。
Sam830131 2013-09-06
  • 打赏
  • 举报
回复
不是给普通人用的, 用的人都不是普通人?
许文君 2013-09-05
  • 打赏
  • 举报
回复
此贴好多熟人啊,老杨王婆卖瓜自卖自夸,用地图服务的莫非和地信有关? 吴总出来打脸真是太不给面子了
小菜程序猿 2013-09-04
  • 打赏
  • 举报
回复
我不是杨中科的学生,但是我层看过杨老师的视频教学,我认为杨老师在国内推广.net有一定贡献,就算是万恶的广告又如何,我支持他。 你们这些人看不惯可以不看,可以不回,但是你们人身攻击就是你们的素质问题。 有本事你们也拿多一些技术贴出来分享,做不到,请靠边站。
「已注销」 2013-09-04
  • 打赏
  • 举报
回复
哈哈 心目中的高尚的杨老师顿时在我内心变得猥琐了 瞬间化为千万匹草泥马奔腾不息
加载更多回复(111)

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧