本文由爱撸小杰翻译,转载请注明出处

原文链接

作者:Mario

当我说所有本地的素材都能在iOS工作,这显然是错误的。结果是iKVM的MonoTouch移植缺少一些基本功能,就是用本地代码调用Java。这需要Box2D的回调,以及确定OpenGL的封装代码里ByteBuffer的直接位置,当然还包括一些其他事情。

 

当Michael 开始移植iKVM到MonoTouch,他遇到了几个问题,其中之一是iKVM的句柄反射(当用本地代码调用Java时也会反过来用到)。 IKVM的实际执行的生成代码能够加速反射,很像Java的工具ASM。在iOS,这是不可能的,因为你不能使内存可执行,因此不能用JIT编译东西。Michael 说干就干,还很有信心,找出后台的反射生成代码,并且替换成更慢更标准的反射机制,看起来像疯了似的。

 

用一些性能的损失换回了更好,更安全的运行。但损失了一个重要组成部分:JNI方法本地代码可以调用一个不知道在哪里的Java对象的方法。它花了我一段时间来弄清楚这一点,我不得不手动浏览了一遍iKVM的代码。最终找到了元凶:MonoTouch的移植中MemberWrapper#invokeJni没有实现。我用缓慢的反射机制修改了它,终于可以按预期运行了。我发出一个简单的修复请求,你可以在这里找到的它。

 

这个故事的寓意:我们对本地代码的依赖,有时候在IOS上会出现令人惊讶的问题。

libgdx ios