Android, App42API & Libgdx - сбой приложения после добавления внешних jar-файлов app42api (зависимости)

Я разрабатываю 2D-игру в Eclipse, используя Android, libgdx, app42api и плиточные карты. В настоящее время я работаю над внедрением системы входа в систему с помощью пользовательского сервиса app42api. Я успешно могу зарегистрироваться и войти в учетную запись, с которой я работаю над загрузкой основного экрана воспроизведения после входа в систему. После исправления предыдущей ошибки мне сказали добавить в несколько внешних jar-файлов, что службы app42api должны функционировать должным образом. Я добавил следующие файлы: httpcore-4.1.jar, httpcore-1.1.1.jar, commons.logging-1.1.1, commons-logging-api-1.1.1. После первоначального добавления в jar мое приложение заработало нормально, вошло в аккаунт и загрузило экран воспроизведения. После того, как я возился с тем, что я выяснил, я неожиданно наткнулся на следующую ошибку, которая теперь вообще не позволяет мне запускать мое приложение для Android.

Ошибка: [2015-05-22 17:55:05 - wurfle-gdx-android] Предупреждение Dx: игнорирование атрибута InnerClasses для анонимного внутреннего класса (org.apache.commons.logging.impl.WeakHashtable$1), который не приходит со связанным атрибутом EnclosingMethod. Этот класс, вероятно, был создан компилятором, который не предназначался для современного формата файла.class. Рекомендуемое решение - перекомпилировать класс из исходного кода с использованием современного компилятора и без указания параметров типа "-target". Следствием игнорирования этого предупреждения является то, что отражающие операции над этим классом будут неверно указывать, что это не внутренний класс. [2015-05-22 17:55:19 - Dex Loader] Невозможно выполнить dex: несколько файлов dex определяют Lorg/apache/commons/logging/Log; [2015-05-22 17:55:19 - wurfle-gdx-android] Преобразование в формат Dalvik завершилось неудачно: невозможно выполнить dex: несколько файлов dex определяют Lorg / apache / commons / logging / Log;

Я могу запустить свое приложение на рабочем столе, но я не инициализировал соединение app42api, поэтому на рабочем столе не будет работать API. Я попытался добавить и удалить банки, очистить мой проект и перезапустить мой cp (некоторые предложения, которые люди говорили о других подобных проблемах, связанных с этой проблемой), но ничего не помогло.

Я приложу некоторые из моих классов, которые используются.

AndroidLauncher.java:

package com.wurfle.game.android;

import android.os.Bundle;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.shephertz.app42.paas.sdk.android.App42API;
import com.wurfle.game.MainGameLoop;
import com.wurfle.game.network.App42Handler;

public class AndroidLauncher extends AndroidApplication 
{

    @Override
    protected void onCreate (Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        App42API.initialize(getContext(), App42Handler.apiKey, App42Handler.secretKey);
        System.out.println("initialized app42api...");
        initialize(new MainGameLoop(), config);


    }
}

Login.java:

package com.wurfle.game.network;

import com.badlogic.gdx.Game;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton.TextButtonStyle;
import com.badlogic.gdx.scenes.scene2d.ui.TextField.TextFieldStyle;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.shephertz.app42.paas.sdk.android.App42Exception;
import com.shephertz.app42.paas.sdk.android.user.UserService;
import com.wurfle.game.States.Play;


public class Login implements Screen
{

    private TextField usernameTxtField, passwordTxtField;
    private TextButton loginBtn;
    private Skin loginSkin;
    private Stage stage;
    private Table table;
    private TextFieldStyle txtFieldStyle;
    private TextureAtlas loginAtlas;
    private BitmapFont font;
    public static String username;

    @Override
    public void render(float delta) 
    {
        Gdx.gl.glClearColor(1,1,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        stage.act(delta);

        stage.draw();
    }

    @Override
    public void show() 
    {

        stage = new Stage();
        // set input processor to stage element
        Gdx.input.setInputProcessor(stage);

        table = new Table();

        table.setBounds(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());


        font = new BitmapFont();
        txtFieldStyle = new TextFieldStyle();
        txtFieldStyle.fontColor = Color.RED;
        txtFieldStyle.font = font;

        usernameTxtField = new TextField("", txtFieldStyle);
        passwordTxtField = new TextField("", txtFieldStyle);


        // set size of text fields
        usernameTxtField.setSize(100, 25);
        passwordTxtField.setSize(100, 25);

        // register button
        loginAtlas = new TextureAtlas("resmenu/menu/loginBtn.pack");
        loginSkin = new Skin(loginAtlas);

        // new style for exit btn
        TextButtonStyle loginButtonStyle = new TextButtonStyle();

        // when user clicks on button, load new image, when he lets go reload
        // original image
        loginButtonStyle.up = loginSkin.getDrawable("menuLoginBtn");
        loginButtonStyle.down = loginSkin.getDrawable("menuLoginBtnPressed");

        // off set btn
        loginButtonStyle.pressedOffsetX = 1;
        loginButtonStyle.pressedOffsetY = -1;

        loginButtonStyle.font = font;

        loginBtn = new TextButton("", loginButtonStyle);
        // add new listener
        loginBtn.addListener(new ClickListener() 
        { // fire event
            public void clicked(InputEvent event, float x, float y) 
            {
                if(usernameTxtField.getText().equals("") || passwordTxtField.getText().equals("")) 
                {

                    System.out.println("need to input sumn..");
                }
                else
                {
                    loginAccount(usernameTxtField.getText().trim(), passwordTxtField.getText().trim());
                }

            }
        });

        // add actors to table
        table.center();
        table.row();
        table.add(usernameTxtField);
        table.row();
        table.add(passwordTxtField);
        table.row();
        table.add(loginBtn);
        table.debug();

        // add table to stage
        stage.addActor(table);

    }

    public void loginAccount(String usr, String pw)
    {
        Login.username = usr;

        try
        {

            UserService us = new UserService(App42Handler.apiKey, App42Handler.secretKey);

            // if username & password exists
            if(us.authenticate(usr, pw) != null)
            {
                System.out.println("account authenticated: " + usr + " just logged in");
                ((Game)Gdx.app.getApplicationListener()).setScreen(new Play());
                dispose();

            }
        }
        catch(App42Exception e)
        {
            e.printStackTrace();
        }

    }


    @Override
    public void resize(int width, int height) 
    {
        // TODO Auto-generated method stub

    }


    @Override
    public void pause() {
        // TODO Auto-generated method stub

    }


    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }


    @Override
    public void hide() {
        // TODO Auto-generated method stub

    }


    @Override
    public void dispose() 
    {

        loginSkin.dispose();
        loginAtlas.dispose();

        font.dispose();

        loginBtn.getListeners().clear();

        stage.dispose();

    }

}

Я позаботился о том, чтобы мои банки были правильно добавлены в путь сборки Android. Я пытался исправить это некоторое время, поэтому любая помощь приветствуется.

Спасибо, Девон.

1 ответ

После ошибок, которыми вы поделились, я обнаружил несколько случаев, таких как:

  1. Несколько файлов dex определяют Lorg/apache/commons/logging/Log; [2015-05-22 17:55:19 - wurfle-gdx-android] Преобразование в формат Dalvik завершилось неудачно: невозможно выполнить dex: несколько файлов dex определяют Lorg / apache / commons / logging / Log; добавлены две одинаковые библиотеки.

  2. Поскольку вы используете сетевой интерфейс us.authenticate(usr, pw) в основном потоке пользовательского интерфейса. Я хотел бы предложить вам использовать наш асинхронный API

    UserService userService = App42API.buildUserService ();
    userService.authenticate (userName, pwd, новый App42CallBack () {
    public void onSuccess (ответ объекта)
    {
    Пользователь пользователь = (Пользователь) ответ;
    System.out.println ("userName is" + user.getUserName ());
    System.out.println ("sessionId is" + user.getSessionId ());
    }
    public void onException (Exception ex)
    {
    System.out.println ("Сообщение об исключении:" + ex.getMessage ());
    }
    });
    Как только вы получите ответ, используйте runOnUI Thread для обновления в потоке пользовательского интерфейса.

  3. Пожалуйста, также поделитесь некоторыми журналами logcat, которые помогут нам отследить точную проблему.

Другие вопросы по тегам