当前位置: 首页 > 知识库问答 >
问题:

net:使用RoboVM在libgdx代码中的NPE

严成礼
2023-03-14

我在一个Android/iOS应用程序中遇到了一个问题:库代码(libgdx?)抛出一个NPE,但不支持在RoboVM中调试。在Android中运行时,它的工作方式与预期一致,并会出现handlehttpresponse()方法。在IOs中运行时,它将到达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()
      {
      }
    }); 
  }
}
<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>

共有1个答案

胡天佑
2023-03-14

假设您使用的是RoboVM最新的0.0.14版本,我认为您的问题是您没有强制链接合适的类来支持HTTPS。请尝试将 节更改为如下所示:

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

如果这不起作用,请尝试将 ** 添加到 中。该模式将拉入类路径上的所有内容。如果这使你的应用程序工作,至少你知道它是在或更多的缺失类导致问题。

 类似资料:
  • 背景:我的一个同事创建了一个3D可视化应用程序,作为一个用于android和windows桌面的libgdx项目。它可以被编译为使用RoboVM在iOS上运行。但是,我希望使用XCode在它周围包装额外的本机用户界面元素。我知道通过RoboVM以编程方式构建用户界面是可能的,但我很想研究一下是否有可能将现有的工作带入Xcode。我不需要编辑3D可视化组件,但添加额外的GUI元素周围的3D Vis窗

  • 我在Android Studio下使用LibGDX和RoboPods来编译iOS。从RoboVM迁移到mobidevelop,我现在面临一些问题。主要的一个是我不能登录谷歌。 我知道您可以在XCode中更改KeyChain参数,但由于这是一个LibGDX游戏,我不使用XCode。 githiub上的一个示例项目说明了这个问题:https://github.com/julienvillegas/li

  • 我有一个我在标题中提到的问题。 根据这个答案,它确实出现在ViewController中的ViewDidAppear中。但是如何将这段代码导入java,如果我想在游戏结束后更改旋转,那么在哪里调用它。 我试着这样做: 卡住了,因为我需要NSObject...

  • 以下是错误日志: !条目org.eclipse.core.jobs 4 2 201 3-10-23 11:12:02.701!消息:“启动my-gdx-game-robovm”期间发生内部错误。!Stack 0 java.lang.ArrayIndexOutOfboundsException:-1 at java.util.arraylist.get(arraylist.java:324)at o

  • 我试图用Gradle在IPhone模拟器上运行一个基本的Hello World libgdx应用程序。我是gradle和Robovm的新手。 首先,我应该指出,我能够成功构建和运行tis示例应用程序https://github.com/jtakakura/robovm-sample-ios-app,使用以下命令: 我认为LaunchiphoneImulator任务依赖于构建任务,调用Lanuchi