在MonoDevelop中获取java.net.MalformedURLException

时间:2013-02-02 10:28:57

标签: ios xamarin.ios libgdx ikvm

嘿,我是MonoDeveloper的新手。我正在尝试将libgdx代码移植到iOS平台。我的Libgdx代码在桌面和桌面上完美运行Android手机。            但是,当我在MonoDeveloper的iPhone模拟器上运行它时,它给了我这个错误:

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>

请在我错的地方给我建议。

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我的猜测是IKVM的MonoTouch端口不包含“文件”协议处理程序。

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

根据过去的问题(来自同一个用户),我认为这是chain反应的输出。 Apple最近开始拒绝大于60MB的应用程序可执行文件

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

现在实现了2.2MB大小,因为BCL 链接(默认情况下 Link SDK 用于设备构建)。这意味着删除了BCL中所使用的所有内容。如果BCL 链接(如果你很好奇就可以禁用它),那么可执行文件大小将 46 MB - 超过20倍! (这也是为什么从不在设备构建时禁用链接器的原因的一部分。)

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

所以,默认情况下,GDX Java(类lib)中的所有内容都被AOT用于本机可执行文件 - 超过Apple的限制(这是previous question)。

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

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

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

答案 4 :(得分:-1)

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

开头
file:

错误消息看起来像是以:

开头
file.