Xamarin 安卓Native Applications开发

[原文发表地址]:Developing Xamarin Android Native Applications

[原文发表时间]:2015/02/23 12:40 PM

Xamarin已经快速成为一种创建跨平台移动应用的流行的方式,从而促进真正的代码重用,同时它允许开发人员创建native* (native 即平台固有的) 用户接口,提供给他们入口去查看底层平台/设备暴露的功能全谱,而且通过允许应用程序利用平台的特定硬件加速来保证native* 性能。此外,Xamarin完全集成到Visual Studio,而且允许像iOS,Android 和Windows 应用开发一样。

Xamarin对我们真正的native (C/C++) 开发人员意味着什么?如果你看一下Xamarin目前针对安卓平台的方法,当编译端到端Xamarin安卓应用程序时,它允许利用安卓 native(C/C++)库。

 然而,目前这种方法影响了Visual Studio中的Xamarin 安卓工程文件, 以及在Xamarin 安卓指南里添加Item-Group,使其指向提到的预置动态共享库。通常这个native动态共享库是在另一个IDE(通常是Eclipse)开发的, 它进一步增加了复杂性以致开发人员现在担心使用两个IDE的动态共享库,而且享受增加复杂性后,他们在时进行编辑、编译和调试他们的应用特别是调试到在native(C/C++)函数库所带来的乐趣。对Visual Studio 2015 CTP 6而言,这已不再是问题,开发人员现在可以在Visual Studio中甚至创建这种native(C/C++) 库,我们(C++ 跨平台移动团队)一直致力于Xamarin的开发,为了在开发Xamarin安卓Native applications时提供一个流畅的体验。这篇博文重点列举了在Visual Studio 2015 CTP 6中已经实现的一些功能,然而所有的工作还没有完成,我们很高兴您尝试使用它,并给我们反馈。

入门指南

开发人员要理解这篇博文,首先就需要安装Visual Studio 2015 CTP6,并且安装时选择Visual C++跨平台移动相关的选项以及Xamarin可选的安装包。一旦这些都已经安装上之后,你已经具备了在Visual Studio中开发完整的Xamarin安卓Native applications的所有条件。我们开始创建一个Xamarin的安卓工程。依照篇博文的目的,我们选择一个最简单的安卓工程模板 “Blank App(安卓)”,打开文件 -〉新工程菜单,创建一个新的工程 “XamarinNativeExample"。

然后,我们从“Visual C++ - Cross-Platform n”节点下给已经创建的解决方案添加一个动态共享库工程“NativeLibrary”。

完成上述操作后,在解决方案管理器中可以看到我们的解决方案有2 个工程(一个Xamarin安卓工程和一个C++动态共享库工程)。

 

从Xamarin安卓工程引用安卓Native库

像这篇博文概要中提到的那样,通常使用native 安卓二进制文件,开发人员不得不在其它的IDE中编译它们,然后要在Xamarin安卓工程中使用这些预编译的安卓native二进制文件,他们不得不native 安卓预览不得不乱七八糟的修改Xamarin安卓工程。在我们现在所做的工作中,引用native库很简单,就像在“XamarinNativeExample”和“NativeLibrary”工程间添加一个工程引用。这个过程如下图所示:

 

引用添加以后,在“XamarinNativeExample”工程的引用部分可以看到 “NativeLibrary”工程。可以看到这个引用现在还没有解决,这是个已知的问题,尽管设计时没有解决引用问题,但编译后的应用包文件(.apk)中会包含native库。

接下来我们继续添加一些代码在我们的native库中,然后从我们的Xamarin安卓工程调用它。在NativeLibrary”工程的“NativeLibrary.cpp”源文件中添加下面这个函数。在我们的Xamarin安卓工程定义了一个按钮,每次点击这个按钮的时候这个函数就会被调用。

int clickCount = 1; int getClickCount() {     return clickCount++; }

 从Xamarin安卓工程“XamarinNativeExample”调用这个函数,在“MainActivity.cs”文件中添加下面一段代码。

 [DllImport("libNativeLibrary.so")]
 public extern static int getClickCount(); 

 应用程序运行时,Dllimport属性将加载安卓native库。要使用这个属性,代码中需要添加“using System.Runtime.InteropServices;”命名空间。接下来我们修改一下“OnCreate”函数中已经存在的源代码。OnCreate方法是activity 被创建后第一个被调用的方法。OnCreate函数修改后,任何时候点击按钮时都允许我们从native库中调用“getClickCount”函数。

 button.Click += delegate { button.Text = string.Format("{0} clicks!", getClickCount()); };

上面的操作都完成后,我们几乎已经完成了所有的步骤。但是,在继续调试我们的工程以及测试我们的新的Xamarin安卓Naative应用之前,我们需要设置合适的活动解决方案平台(ARM或者x86取决于调试目标的选择),如下图所示。

最后,在NativeLibrary工程的属性页面,我们看一下“Target Name”属性,确保 “NativeLibrary”的命名正确。

这时我们已经完成所有的设置,可以继续调试或运行我们的应用在安卓设备或者模拟器上。按照这篇博文的操作一旦你遇到任何问题,可以找到这篇博文里面的解决方案。

在Xamarin安卓应用中调试安卓Native库

除了轻松地在一个Xamarin安卓应用中构建并编译一个native安卓库之外,Visual studio也将允许开发人员很容易的调试他们创建的有Xamarin安卓应用的native安卓库代码。为了证明这一点,继续以前面的“XamarinNativeExample”工程为例,打开它的属性页面,选择“安卓选项”菜单中的“Native”,如下图所示。

然后我们打开“NativeLibrary.cpp”源文件,在“getClickCount()”函数中设置一个断点并开始调试(F5)。一旦应用开始调试,我们设置的每个按钮的断点都应该命中。

 

虽然这是一个简单的例子,其它所有的调试功能,如表达式求值,监视窗口,自动窗口和这个例子一样。

结语

这篇博文给大家展示了Visual Studio团队和Xamarin一起合作,让大家在编译Xamarin安卓Native applications时经历一个流畅的体验。我们很期待你们去体验并给我们反馈。此外,如果你们想让我们讨论一个特定的题目在博文中,请让我们知道。需要提醒的是这个CTP版本的目标是为我们收集反馈以及向你们学习。我们正考虑将来也支持给其它的平台,您的反馈对于我们产品的方向至关重要。

分享反馈很简单!在用户之声上可以提出功能建议,在我们的联系地址可以记录你发现的bugs,给我们发一个笑脸或眉头从IDE里面。同时,你也可以在下面评论。此外,如果你在寻找一个直接方式与我们的产品团队讨论这个话题,请通过邮件联系我们(aasthan@microsoft.com)。我们很高兴了解更多并与你联系。

XamarinNative示例.zip