在MonoDeveloper中获取java.net.MalformedURLException

嘿,我是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> 

请给我build议,我错了。

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

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

我自己find了这个问题的答案。

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

findExample.java的第208行,看看它绊倒在哪个文件上。

接下来,在Xamarin / mono studio中find这个文件并右键点击它。
然后进入“Build Option”>“BundleResource”。

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

这是巨大的,用Xamarin.iOS创build的一个基本的Hello World应用程序是在3 MB以下,这是总应用程序的大小。 该可执行文件本身在2.2MB以下,包括Mono运行时, 链接的基类库(BCL)和未链接的用户代码。

现在,这个2.2MB的大小是因为BCL 链接的 (默认情况下, Link SDK用于设备构build)。 这意味着BCL中没有使用的所有东西都被删除了。 如果BCL 没有链接(如果您好奇的话可以禁用),那么可执行文件的大小将是46 MB ,比20倍大! (这也是你不应该在设备构build中禁用链接器的原因之一)。

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

所以, 默认情况下 ,GDX Java(lib类)中的所有内容都被AOT格式化为本机可执行文件 – 这超过了苹果公司的限制(这是前一个问题 )。

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

但是,这又回到了主链接器的限制。 它使用静态分析来检测未使用的代码 – reflection(来自.NET或Java)是dynamic的。 所以链接器需要帮助保存(使用[Preserve]属性或XML文件 )通过reflection使用的代码。

我还没有看到Java代码处理协议 – 但我很确定它使用reflection来加载基于模式(例如file )的types,并且该types(s)需要保留在运行时正常工作。 一旦保存,我相信应用程序将正常工作(而不是不适当的大)。

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

 file: 

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

 file. 

使用绝对path来包含文件。

像这样调用文件:

 new FileHandle("/Users/..../.../.../.../my-gdx-game-ios/data/file.json") 

代替

 Gdx.files.internal("data/file.json")