【问题标题】:Gdx.net: NPE in libgdx code with RoboVMGdx.net:带有 RoboVM 的 libgdx 代码中的 NPE
【发布时间】:2014-07-25 06:54:05
【问题描述】:

我在使用 Android/IOs 应用时遇到问题:库代码 (libgdx?) 会引发 NPE,但不支持在 RoboVM 中进行调试。在 Android 中运行时,它按预期工作并达到handleHttpResponse() 方法。在 IO 中运行时,它会到达 failed(Throwable t) 方法,其中 t 为NullPointerException。我创建了一个示例应用程序来显示问题,也许是我的错,所以这里是代码:

public class Npe extends ApplicationAdapter {
  SpriteBatch batch;
  Texture img;

  @Override
  public void create () {
    batch = new SpriteBatch();
    img = new Texture("badlogic.jpg");
    loadHttps("https://www.google.it");
  }

  @Override
  public void render () {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(img, 0, 0);
    batch.end();
  }

  private static void loadHttps(String url) {
    HttpRequest httpGet = new HttpRequest(HttpMethods.GET);

    httpGet.setUrl(url);

    Gdx.net.sendHttpRequest(httpGet, new HttpResponseListener() {
      @Override
      public void handleHttpResponse(HttpResponse httpResponse) {
        String res = httpResponse.getResultAsString();
        System.err.println("res = \"" + res + "\"");
      }

      @Override
      public void failed(Throwable t) {
        System.err.println("On IOs we reach this point");
        t.printStackTrace(); // and t is a NPE
      }

      @Override
      public void cancelled()
      {
      }
    }); 
  }
}

还有我的 robovm.xml:

<config>
  <executableName>${app.executable}</executableName>
  <mainClass>${app.mainclass}</mainClass>
  <os>ios</os>
  <arch>thumbv7</arch>
  <target>ios</target>
  <iosInfoPList>Info.plist.xml</iosInfoPList>
  <resources>
    <resource>
      <directory>../android/assets</directory>
      <includes>
        <include>**</include>
      </includes>
      <skipPngCrush>true</skipPngCrush>
    </resource>
    <resource>
      <directory>data</directory>
    </resource>
  </resources>
  <forceLinkClasses>

    <pattern>org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl</pattern>  

    <pattern>com.android.org.conscrypt.JSSEProvider</pattern>
    <pattern>com.android.org.conscrypt.OpenSSLProvider</pattern>
    <pattern>com.android.org.conscrypt.OpenSSLSocketFactoryImpl</pattern>
    <pattern>com.android.okhttp.HttpsHandler</pattern>

    <pattern>com.badlogic.gdx.scenes.scene2d.ui.*</pattern>
    <pattern>org.apache.harmony.xnet.provider.jsse.OpenSSLProvider</pattern>
    <pattern>org.apache.harmony.security.provider.cert.DRLCertFactory</pattern>
    <pattern>com.android.org.bouncycastle.jce.provider.BouncyCastleProvider</pattern>
    <pattern>org.apache.harmony.security.provider.crypto.CryptoProvider</pattern>
    <pattern>org.apache.harmony.xnet.provider.jsse.JSSEProvider</pattern>
    <pattern>com.android.org.bouncycastle.jce.provider.JDKKeyStore</pattern>
    <pattern>org.apache.harmony.security.provider.cert.X509CertFactoryImpl</pattern>
    <pattern>com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi</pattern>
    <pattern>org.apache.harmony.xnet.provider.jsse.OpenSSLMessageDigestJDK$MD5</pattern>
  </forceLinkClasses>
  <libs>
    <lib>build/libs/ios/libgdx-box2d.a</lib>
    <lib>build/libs/ios/libgdx-bullet.a</lib>
    <lib>build/libs/ios/libgdx-freetype.a</lib>
    <lib>build/libs/ios/libgdx.a</lib>
    <lib>build/libs/ios/libObjectAL.a</lib>
  </libs>
  <frameworks>
    <framework>UIKit</framework>
    <framework>OpenGLES</framework>
    <framework>QuartzCore</framework>
    <framework>CoreGraphics</framework>
    <framework>OpenAL</framework>
    <framework>AudioToolbox</framework>
    <framework>AVFoundation</framework>
  </frameworks>
</config>

【问题讨论】:

    标签: java ios libgdx robovm


    【解决方案1】:

    假设您使用的是最新的 0.0.14 版本的 RoboVM,我相信您的问题是您没有强制链接正确的类以支持 HTTPS。请尝试将您的 &lt;forceLinkClasses&gt; 部分更改为如下所示:

    <forceLinkClasses>
        <pattern>com.badlogic.gdx.scenes.scene2d.ui.*</pattern>
    
        <!-- For http: support in URLConnection -->
        <pattern>com.android.okhttp.HttpHandler</pattern>
    
        <!-- For https: support in URLConnection -->
        <pattern>com.android.okhttp.HttpsHandler</pattern>
        <!-- OpenSSL is preferred over BouncyCastle. This pulls in full OpenSSL support. -->
        <pattern>com.android.org.conscrypt.**</pattern>
        <!-- We still need KeyStore.BKS and CertPathValidator.PKIX from BouncyCastle -->
        <pattern>com.android.org.bouncycastle.jce.provider.BouncyCastleProvider</pattern>
        <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.BC$Mappings</pattern>
        <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi</pattern>
        <pattern>com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std</pattern>
        <pattern>com.android.org.bouncycastle.jce.provider.PKIXCertPathValidatorSpi</pattern>
        <!-- Use AndroidDigestFactoryOpenSSL as AndroidDigestFactory implementation -->
        <pattern>com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL</pattern>
    </forceLinkClasses>
    

    如果这不起作用,请尝试将&lt;pattern&gt;**&lt;/pattern&gt; 添加到您的&lt;forceLinkClasses&gt;。该模式将拉入您的类路径中的所有内容。如果这使您的应用能够正常运行,那么至少您知道它存在或更多缺少的类会导致问题。

    【讨论】:

    • 谢谢,它适用于您提出的条目,不需要 **。已接受答案。
    • 我知道这是一个非常古老的答案,但我在 libgdx 1.9.8/latest robovm 上看到了上述 forceLinkClasses 描述的问题。我想知道现在是否需要其他东西来支持 HTTPS - 如果我发现其他人偶然发现此问题,我会在此处添加另一条评论。
    猜你喜欢
    • 2014-05-06
    • 2016-07-01
    • 2014-08-07
    • 2013-11-18
    • 1970-01-01
    • 2017-04-24
    • 2016-06-19
    • 2019-09-13
    • 2016-02-12
    相关资源
    最近更新 更多