0

I'm having a problem with a Android/IOs app: the library code (libgdx?) throws a NPE, but debugging in RoboVM is not supported. When run in Android, it works as expected and reeaches the handleHttpResponse() method. When run in IOs, it reaches the failed(Throwable t) method with t being a NullPointerException. I've created a sample app to show the issue, maybe it's my fault, so here is the code:

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()
      {
      }
    }); 
  }
}

and my 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>
Daahrien
  • 10,190
  • 6
  • 39
  • 71
Lucio Crusca
  • 1,277
  • 3
  • 15
  • 41

1 Answers1

5

Assuming you are using the latest 0.0.14 release of RoboVM I believe your problem is that you haven't forced linked the proper classes for HTTPS support. Please try to change your <forceLinkClasses> section to look like this:

<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>

If that doesn't work please try to add <pattern>**</pattern> to your <forceLinkClasses>. That pattern will pull in everything on your classpath. If that makes your app work at least you know that it is on or more missing classes that are causing the problem.

ntherning
  • 1,160
  • 7
  • 8
  • Thanks, it works with the entries you proposed, no need for **. Answer accepted. – Lucio Crusca Jul 25 '14 at 15:59
  • I'm aware this is a very old answer, but I'm seeing the issue described with the above forceLinkClasses, on libgdx 1.9.8/latest robovm. I wonder if something else is needed for HTTPS support now - will add another comment here if I find out in case anyone else stumbles across this. – Joel Auterson Jan 31 '18 at 11:10