问题标签 [dot42]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1076 浏览

c# - 使用 dot42 触发事件

我尝试使用 dot42 迈出第一步。

我定义了一个这样的按钮:

我想我现在可以在 MainActivity 类中定义一个方法,如下所示:

但不幸的是,单击该按钮时我得到一个例外..

您可以在此处找到有关 dot42的信息

0 投票
2 回答
946 浏览

c# - 未知的外部方法 T System.Nullable`1::get_Value()

我的 dot42 C# 项目遇到了问题:

导致该问题的代码:

(int),.Value.GetValueOrDefault(), 正如预期的那样,产生相同的结果:这个错误。

我该如何解决?

0 投票
2 回答
12595 浏览

c# - 如何使用带有 Xamarin 或 Dot42 的 async/await 在 C# 中实现 Android 回调?

如何在 C# 中使用 async/await 和 Xamarin for Android 实现回调?这与 Android 的标准 Java 编程相比如何?

0 投票
7 回答
55922 浏览

c# - 如何比较用 Java 和 Xamarin C# 编写的 Android 应用程序的性能?无论如何检查定量数据(代码和结果)

我遇到了 Xamarin 声称他们在 Android 上的 Mono 实现和他们的 C# 编译的应用程序比 Java 代码更快。是否有人在不同的 Android 平台上对非常相似的 Java 和 C# 代码执行实际基准测试以验证此类声明,可以发布代码和结果?

添加于 2013 年 6 月 18 日

由于没有答案,也找不到其他人做过的基准测试,所以决定自己做测试。不幸的是,我的问题仍然“锁定”,所以我不能将此作为答案发布,只能编辑问题。请投票重新打开这个问题。对于 C#,我使用了 Xamarin.Android Ver。4.7.09001(测试版)。源代码,我用于测试和编译 APK 包的所有数据都在 GitHub 上:

Java:https ://github.com/gregko/TtsSetup_Java

C#:https ://github.com/gregko/TtsSetup_C_sharp

如果有人想在其他设备或模拟器上重复我的测试,我也有兴趣了解结果。

我的测试结果

我将我的句子提取器类移植到 C#(来自我的 @Voice Aloud Reader 应用程序),并对 10 个英语、俄语、法语、波兰语和捷克语的 HTML 文件进行了一些测试。每次运行对所有 10 个文件执行 5 次,下面发布了 3 个不同设备和一个模拟器的总时间。我只测试了“发布”版本,没有启用调试。

HTC Nexus One Android 2.3.7 (API 10) - CyanogenMod ROM

Java:总计时间(5 次运行):12361 毫秒,文件读取总计:13304 毫秒

C#:总计时间(5 次运行):17504 毫秒,文件读取总计:17956 毫秒

三星 Galaxy S2 SGH-I777 (Android 4.0.4, API 15) - CyanogenMod ROM

Java:总计时间(5 次运行):8947 毫秒,文件读取总计:9186 毫秒

C#:总计时间(5 次运行):9884 毫秒,文件读取总计:10247 毫秒

三星 GT-N7100 (Android 4.1.1 JellyBean, API 16) - 三星 ROM

Java:总时间(5 次运行):9742 毫秒,文件读取总时间:10111 毫秒

C#:总计时间(5 次运行):10459 毫秒,文件读取总计:10696 毫秒

模拟器 - 英特尔(Android 4.2,API 17)

Java:总时间(5 次运行):2699 毫秒,文件读取总时间:3127 毫秒

C#:总时间(5 次运行):2049 毫秒,文件读取总时间:2182 毫秒

模拟器 - 英特尔(Android 2.3.7,API 10)

Java:总时间(5 次运行):2992 毫秒,文件读取总时间:3591 毫秒

C#:总计时间(5 次运行):2049 毫秒,文件读取总计:2257 毫秒

模拟器 - Arm(Android 4.0.4,API 15)

Java:总时间(5 次运行):41751 毫秒,文件读取总时间:43866 毫秒

C#:总计时间(5 次运行):44136 毫秒,文件读取总计:45109 毫秒

简要讨论

我的测试代码主要包含文本解析、替换和正则表达式搜索,也许对于其他代码(例如更多数字运算)结果会有所不同。在所有配备 ARM 处理器的设备上,Java 的性能优于 Xamarin C# 代码。最大的区别是在 Android 2.3 下,其中 C# 代码的运行速度约为。Java 速度的 70%。

在 Intel 仿真器(采用 Intel HAX 技术,仿真器以快速 virt 模式运行)上,Xamarin C# 代码运行我的示例代码比 Java 快得多 - 大约快 1.35 倍。也许 Mono 虚拟机代码和库在 Intel 上比在 ARM 上优化得更好?

编辑 2013 年 7 月 8 日

我刚刚安装了 Genymotion Android 模拟器,它在 Oracle VirtualBox 中运行,这个模拟器再次使用本机英特尔处理器,而不是模拟 ARM 处理器。与英特尔 HAX 仿真器一样,C# 在这里的运行速度也快得多。这是我的结果:

Genymotion 模拟器 - 英特尔(Android 4.1.1,API 16)

Java:总时间(5 次运行):2069 毫秒,文件读取总时间:2248 毫秒

C#:总计时间(5 次运行):1543 毫秒,文件读取总计:1642 毫秒

然后我注意到 Xamarin.Android beta 版本 4.7.11 有更新,发行说明也提到了 Mono 运行时的一些变化。决定快速测试一些 ARM 设备,并大吃一惊 - C# 数字有所改进:

BN Nook XD+,ARM (Android 4.0)

Java:总时间(5 次运行):8103 毫秒,文件读取总时间:8569 毫秒

C#:总计时间(5 次运行):7951 毫秒,文件读取总计:8161 毫秒

哇!C# 现在比 Java 好?决定在我的 Galaxy Note 2 上重复测试:

三星 Galaxy Note 2 - ARM (Android 4.1.1)

Java:总时间(5 次运行):9675 毫秒,文件读取总时间:10028 毫秒

C#:总计时间(5 次运行):9911 毫秒,文件读取总计:10104 毫秒

这里 C# 似乎只是稍微慢了一点,但这些数字让我停顿了一下:为什么时间比 Nook HD+ 长,即使 Note 2 有更快的处理器?答案:省电模式。在 Nook 上,它被禁用,在 Note 2 上 - 启用。决定在禁用省电模式的情况下进行测试(与启用一样,它也会限制处理器速度):

三星 Galaxy Note 2 - ARM (Android 4.1.1),已禁用省电功能

Java:总时间(5 次运行):7153 毫秒,文件读取总时间:7459 毫秒

C#:总计时间(5 次运行):6906 毫秒,文件读取总计:7070 毫秒

现在,令人惊讶的是,C# 在 ARM 处理器上也比 Java 稍快。大进步!

编辑 2013 年 7 月 12 日

我们都知道,在速度方面没有什么比本机代码更好的了,而且我对我在 Java 或 C# 中的分句器的性能不满意,特别是我需要改进它(因此让它变得更慢)。决定用 C++ 重写它。这是我的 Galaxy Note 2 上的原生速度与 Java 速度的一小部分(即比以前的测试更小的文件集,出于其他原因)比较,其中禁用了省电模式:

Java:总时间(5 次运行):3292 毫秒,文件读取总时间:3454 毫秒

原生拇指:总计时间(5 次运行):537 毫秒,文件读取总计:657 毫秒

本机手臂:总时间(5 次运行):458 毫秒,文件读取总时间:587 毫秒

看起来对于我的特定测试,本机代码比 Java 快 6 到 7 倍。警告:无法在 Android 上使用 std::regex 类,因此必须编写我自己的专门例程来搜索段落中断或 html 标记。我在 PC 上使用正则表达式对相同代码的初始测试比 Java 快了大约 4 到 5 倍。

呸!再次用 char* 或 wchar* 指针唤醒原始内存,我瞬间感觉年轻了 20 岁!:)

编辑 2013 年 7 月 15 日

(请参见下文,编辑于 2013 年 7 月 30 日,以获得更好的 Dot42 效果)

遇到一些困难,我设法将我的 C# 测试移植到 Dot42(版本 1.0.1.71 beta),这是另一个适用于 Android 的 C# 平台。初步结果表明,在英特尔 Android 模拟器上,Dot42 代码比 Xamarin C# (v. 4.7.11) 慢约 3 倍(3 倍)。一个问题是 Dot42 中的 System.Text.RegularExpressions 类没有我在 Xamarin 测试中使用的 Split() 函数,所以我改用 Java.Util.Regex 类和 Java.Util.Regex.Pattern.Split() ,所以在代码的这个特定位置,有这个小的差异。不过应该问题不大。Dot42 编译为 Dalvik (DEX) 代码,因此它原生与 Android 上的 Java 协作,不需要像 Xamarin 那样从 C# 到 Java 的昂贵互操作。

只是为了比较,我还在 ARM 设备上运行测试 - 这里的 Dot42 代码“仅”比 Xamarin C# 慢 2 倍。这是我的结果:

HTC Nexus One 安卓 2.3.7 (ARM)

Java:总计时间(5 次运行):12187 毫秒,文件读取总计:13200 毫秒

Xamarin C#:总计时间(5 次运行):13935 毫秒,文件读取总计:14465 毫秒

Dot42 C#:总时间(5 次运行):26000 毫秒,文件读取总时间:27168 毫秒

三星 Galaxy Note 2,Android 4.1.1 (ARM)

Java:总计时间(5 次运行):6895 毫秒,文件读取总计:7275 毫秒

Xamarin C#:总计时间(5 次运行):6466 毫秒,文件读取总计:6720 毫秒

Dot42 C#:总时间(5 次运行):11185 毫秒,文件读取总时间:11843 毫秒

英特尔仿真器,Android 4.2 (x86)

Java:总时间(5 次运行):2389 毫秒,文件读取总时间:2770 毫秒

Xamarin C#:总计时间(5 次运行):1748 毫秒,文件读取总计:1933 毫秒

Dot42 C#:总时间(5 次运行):5150 毫秒,文件读取总时间:5459 毫秒

对我来说,有趣的是,Xamarin C# 在较新的 ARM 设备上比 Java 稍快,在旧的 Nexus One 上稍慢。如果有人也想运行这些测试,请告诉我,我会更新 GitHub 上的源代码。看到带有英特尔处理器的真正 Android 设备的结果会特别有趣。

2013 年 7 月 26 日更新

只是一个快速更新,由具有最新 Xamarin.Android 4.8 和今天发布的 dot42 1.0.1.72 更新的基准应用程序重新编译 - 与之前报告的结果相比没有显着变化。

2013 年 7 月 30 日更新 - dot42 的结果更好

使用 Robert(来自 dot42 制造商)将我的 Java 代码移植到 C# 重新测试了 Dot42。在最初为 Xamarin 完成的 C# 移植中,我将一些原生 Java 类(如 ListArray)替换为 C# 原生的 List 类等。Robert 没有我的 Dot42 源代码,因此他再次从 Java 移植它并使用原始 Java 类这样的地方,这有利于 Dot42,我猜是因为它在 Dalvik VM 中运行,如 Java,而不是在 Mono 中,如 Xamarin。现在 Dot42 结果好多了。这是我的测试日志:

2013 年 7 月 30 日 - 在 Dot42 C# 中使用更多 Java 类进行 Dot42 测试

英特尔模拟器,Android 4.2

Dot42,使用 StringBuilder.Replace() 的 Greg 代码(如在 Xamarin 中):
总时间(5 次运行):3646 毫秒,文件读取总计:3830 毫秒

Dot42,使用 String.Replace() 的 Greg 的代码(如 Java 和 Robert 的代码):
总时间(5 次运行):3027 毫秒,文件读取总计:3206 毫秒

Dot42,罗伯特的代码:
总时间(5 次运行):1781 毫秒,文件读取总时间:1999 毫秒

Xamarin:
总计时间(5 次运行):1373 毫秒,文件读取总计:1505 毫秒

Java:
总计时间(5 次运行):1841 毫秒,文件读取总计:2044 毫秒

ARM、三星 Galaxy Note 2、省电关闭、Android 4.1.1

Dot42,使用 StringBuilder.Replace() 的 Greg 代码(如在 Xamarin 中):
总时间(5 次运行):10875 毫秒,文件读取总计:11280 毫秒

Dot42,使用 String.Replace() 的 Greg 的代码(如 Java 和 Robert 的代码):
总时间(5 次运行):9710 毫秒,文件读取总计:10097 毫秒

Dot42,罗伯特的代码:
总时间(5 次运行):6279 毫秒,文件读取总时间:6622 毫秒

Xamarin:
总计时间(5 次运行):6201 毫秒,文件读取总计:6476 毫秒

Java:
总计时间(5 次运行):7141 毫秒,文件读取总计:7479 毫秒

我仍然认为Dot42还有很长的路要走。拥有类似 Java 的类(例如 ArrayList)和良好的性能将使从 Java 到 C# 的代码移植稍微容易一些。然而,这是我不太可能做的事情。我宁愿使用现有的 C# 代码(库等),它将使用本机 C# 类(例如 List),并且在当前的 dot42 代码中运行缓慢,并且在 Xamarin 中运行良好。

格雷格

0 投票
1 回答
463 浏览

dot42 - 在 dot42 项目和单声道桌面项目之间共享代码

这个想法是在使用 Mono 的桌面应用程序和 dot42 应用程序之间共享代码。所以我的问题是:有没有办法在 dot42 中导入可移植类库甚至是公共库?如果没有,有没有办法在他们之间共享代码?谢谢。

0 投票
1 回答
474 浏览

visual-studio-2012 - Visual Studio 2012 无法创建 dot42 项目

在运行安装dot42并指定Visual Studio 2010集成和Visual Studio 2012集成后,我无法在 2012 年找到“dot42”项目。2010 年,新的 dot42 子类别在下面打开C#,我能够查看要创建的项目类型。

我注意到 dot42 将其 dll 安装在Extensions文件夹中,查看C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions文件夹,dot42 文件就在那里,就像它们在Visual Studio 10.0.

为什么我不能在 Visual Studio 2012 中创建 dot42 项目?

0 投票
1 回答
314 浏览

licensing - 我可以使用 dot42 的社区许可广告吗?

我想开始为 Android 制作应用程序,我想知道我是否可以安全地开始使用免费许可证,看看我是否可以通过我的应用程序中的广告赚钱。所以我的问题是我可以这样做吗?

社区许可证是免费的。它不允许任何形式的商业用途。此外,社区许可证允许您在公共市场上发布免费应用程序,例如(但不限于)Google Play 或 SlideME。

这似乎是一种商业用途,但话又说回来,该应用程序将是免费的……如果答案是否定的,您会推荐其他一些制作免费应用程序的方法吗?HTML5?Java 与 Eclipse?

提前致谢!

0 投票
1 回答
175 浏览

c# - 无法将枚举转换为 int dot42

我正在评估使用 dot42 框架来使用 C# 来定位 android。因此,在了解 dot42 可以做什么和不能做什么的过程中,我遇到了以下铸造不工作的问题。抛出 Java 表达式错误。

有没有办法解决 ?

谢谢...

0 投票
1 回答
524 浏览

android - dot42:为原始资源(mp3 文件)调用 SoundPool.Load 方法时引发异常

我将 Beep.mp3 文件添加到我的项目中并将其类型设置为 RawResource。构建后,我可以看到在 R.Raws.Beep 中生成的 id,所以我认为一切都很好。但是,当我尝试使用该资源并将声音加载到 SoundPool 实例中时,我收到一条异常消息“来自可绘制资源 ID #0x7f030000 的文件 res/raw/beep.mp3”,另外在设备日志窗口中,我可以看到 SoundPool 日志“示例0 未成立”(真的,这就是它所说的“成立”)。我什至检查了我的应用程序的 apk 文件的内容,我可以看到 res/raw/beep.mp3 确实在那里,所以似乎在包中嵌入资源是可行的,错误的原因要么在我的代码中,要么我没有做任何事情其他需要它才能工作。

此文件的原因是当用户在我的应用程序中执行某些操作时会发出哔哔声,因此它不像我自己的 winamp 克隆或类似的东西。

好的,这是我执行的代码,并且出现异常:

我从我的活动 OnCreate 方法中调用 SoundMaster.InitSounds() 方法,并将其作为参数传递,所以我相信它是完全正确的 Context 实例。

一件事是嵌入在apk中的文件名为beep.mp3,而我包含在项目中的实际文件是Beep.mp3,但我多次尝试使用不同的文件名称和资源ID,并且总是得到相同的异常。

那么,任何人都可以分享一些想法,这可能是我在这段代码中遇到麻烦的原因吗?或者也许我应该使用不同的方式来播放我的哔声(例如 MediaPlayer?),但我觉得代码是正确的并且可以工作,但资源不知何故搞砸了。

0 投票
1 回答
211 浏览

andengine - 在 dot42 项目中使用 AndEngine:编译错误

我正在使用 dot42 在 C# 中开发简单的 2D 游戏并瞄准 Android 市场。游戏非常简单,所以我可以自己完成工作,但由于 AndEngine 似乎已经实现了我需要的所有功能(捏缩放、平移、适当的场景工作流程等),我认为这将是一个很好的机会熟悉那个引擎。既然 dot42 说可以使用罐子,那会出什么问题呢?

显然很多:

  • 首先将 andengine.jar 包含到项目中后,我得到了

    Cannot resolve B in context org.andengine.util.adt.spatial.quadtree.FloatQuadTree

在试图找出该模板类的哪种用法导致它之后,我最终通过注释掉该包中的所有 3 个类来“修复”(据我所知,所有传递的类型都是从所需接口派生的,所以无论如何......)

  • 然后我得到了 12 个与 IModifier 下层次结构中抽象类的错误返回类型相关的错误,就像这样

    'Org.Andengine.Entity.Modifier.SingleValueChangeEntityModifier.DeepCopy()':返回类型必须是 'Org.Andengine.Util.Modifier.IModifier' 以匹配被覆盖的成员 'Org.Andengine.Util.Modifier.BaseModifier.DeepCopy()' D:\Development\AndEngineTest\dot42Application1\obj\Debug\andengine.cs

dot42 指示的类是抽象的,因此它们没有 DeepCopy 方法的实现,该方法在派生的类中正确实现。据我所知,一切都应该没问题,因为可以实例化的类具有完整的实现。好的,这些实现不会返回与层次结构顶部(底部?我总是混淆)接口中的方法“相同类型”,而是实现该方法的类的派生类型,但这应该是完全可以的。尤其是 Java 没有抱怨任何如此激烈的事情。

如果 dot42 变得太复杂,我有一种感觉,它会在继承层次结构的某个地方迷失。

AndEngine 是今天从官方分支下载的,使用 ADT 包编译为 Android 4.0.3(我决定支持的最低系统版本)。编译显示了一些警告,但它们都是关于已弃用的东西,所以我认为在这种情况下它并不重要。

所以有人试过并且可以分享一些提示吗?也许 dot42 dev 会再次回答我的问题?:)