3

Hey I am new to MonoDeveloper. I am trying to port libgdx code to iOS platform. My Libgdx code runs perfectly on desktop & Android phone. But when i run it on iPhone simulator with MonoDeveloper its giving me this error:

Unhandled Exception: 0   iosgame   
[ERROR] FATAL UNHANDLED EXCEPTION: java.net.MalformedURLException: unknown protocol: file.
0x000e8932 mono_handle_exception_internal_first_pass + 3058 1 iosgame                             
0x000ea012 mono_handle_exception_internal + 1602 2   iosgame                     
0x000eab5f mono_handle_exception + 47 3   iosgame                     
0x0012dcb2 mono_x86_throw_exception + 306 4   ???                     
0x0b73df8f 0x0 + 192143247 at java.net.URL..ctor (java.net.URL,string)
<IL 0x00004, 0x00018> at java.net.URL..ctor (string) 
<IL 0x00003, 0x00018> at java.net.URI.toURL () 
<IL 0x00023, 0x00064> at IKVM.Internal.AssemblyClassLoader.MakeResourceURL(System.Reflection.Assembly,string) 
<IL 0x00016, 0x0006c> at IKVM.Internal.AssemblyClassLoader/AssemblyLoader.FindResources(string) 
<IL 0x0003c, 0x00084> at IKVM.Internal.AssemblyClassLoader/<GetResourcesImpl>c__Iterator0.MoveNext() 
<IL 0x00068, 0x00070> at IKVM.Internal.AssemblyClassLoader/<GetResourcesImpl>c__Iterator0.MoveNext() 
<IL 0x003dc, 0x0069f> at IKVM.NativeCode.ikvm.runtime.AssemblyClassLoader.getResource(java.lang.ClassLoader,System.Reflection.Assembly,string) 
<IL 0x00034, 0x0009c> at ikvm.runtime.AssemblyClassLoader.getResource(java.lang.ClassLoader,System.Reflection.Assembly,string) 
<IL 0x00006, 0x00018> at ikvm.runtime.AssemblyClassLoader.getResource (string) 
<IL 0x00000, 0x0001c>

Kindly give me suggestion where i am wrong.

4

5 回答 5

1

这可能是 libgdx 或 IKVM 中的一个错误,该库用于将 Java 代码移植到 .NET/Mono 运行时。您是否向 libgdx 开发人员报告过?

于 2013-02-03T00:04:20.153 回答
0

My guess is that the MonoTouch port of IKVM doesn't include the "file" protocol handler.

于 2013-02-05T13:03:30.530 回答
0

基于过去的问题(来自同一用户),我认为这是连锁反应的结果。Apple 最近开始拒绝大于 60MB的应用程序可执行文件。

这是巨大的,使用 Xamarin.iOS 创建的基本 hello world 应用程序不到 3 MB,这就是应用程序的总大小。可执行文件本身不到 2.2MB,包括 Mono 运行时、链接的基类库 (BCL) 和链接的用户代码。

现在这个 2.2MB 大小已经实现,因为 BCL 已链接(默认情况下,链接 SDK用于设备构建)。这意味着BCL中未使用的所有内容都将被删除。如果 BCL链接(如果您好奇,可以禁用它)然后可执行文件大小将是46 MB - 超过 20 倍!(这就是为什么您永远不应该在设备构建上禁用链接器的部分原因)。

LibGDX 是一个 Java 库。通过使用 IKVM 转换为 .NET,它可以与 Xamarin.iOS 一起使用。这将转换 GDX 库Java 类库。所有这些都是用户代码(即您添加的内容)而不是SDK代码(即 Xamarin 提供的代码)。IOW 默认情况下,链接器不会从 GDX(或 IKVM 库)中删除任何内容。

因此,默认情况下,GDXJava(类库)中的所有内容都被 AOT 编译到本机可执行文件中 - 导致它超过了 Apple 的限制(这是上一个问题)。

之前的答案是使用Link all assembly,IOW 在所有应用程序托管代码上运行链接器。这会删除大量未使用的代码并导致更小的应用程序和可执行文件大小(参见上面的 hello world 示例)。

然而,它又回到了主要的链接器限制。它使用静态分析来检测未使用的代码——反射(来自 .NET 或 Java)是动态的。因此,链接器需要帮助来保存(使用[Preserve]属性或XML 文件)通过反射使用的代码。

我还没有看到 Java 代码处理协议 - 但我很确定它使用反射来加载基于方案(例如file)的类型,并且需要保留该类型以在运行时正常工作。一旦保存,我确信应用程序将正常工作(并且不会太大)。

于 2013-05-02T17:15:33.703 回答
0

我自己找到了问题的答案。

在堆栈跟踪中,它将提及您的 Java 代码的哪一行正在调用 MalformedURLException。例如:Example.java :208

找到Example.java的第 208 行,看看它遇到了什么文件。

接下来,在 Xamarin/mono studio 中找到此文件并右键单击它。
然后转到“构建选项”>“BundleResource”。

于 2013-04-30T19:26:22.870 回答
-1

“未知协议:文件”之后是否有一点?在这种情况下,类路径 URI 是错误的。看起来有任何设置错误。文件 URL 应以:

file:

错误消息看起来像它开头:

file.
于 2013-02-03T09:14:59.987 回答