我正在使用Android,libgdx,app42api和平铺地图在eclipse中开发2D游戏。我目前正在使用app42api的用户服务实现登录系统。我成功注册并登录到一个帐户,登录后我正在加载我的主播放屏幕。修复上一个错误后,我被告知要添加一些外部jar的app42api&#39 ; s服务需要正常运行。我在以下jar中添加了:httpcore-4.1.jar,httpcore-1.1.1.jar,commons.logging-1.1.1,commons-logging-api-1.1.1。最初添加到罐子后,我的应用程序运行正常,登录帐户并加载播放屏幕。搞砸了我想到的东西后,我突然发现了以下错误,现在阻止我运行我的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构建路径中。我一直试图解决这个问题,所以任何帮助都会受到赞赏。
谢谢, 德文。
答案 0 :(得分:0)
在收到您分享的错误后,我发现了一些案例:
多个dex文件定义Lorg / apache / commons / logging / Log; [2015-05-22 17:55:19 - wurfle-gdx-android]转换为Dalvik格式失败:无法执行dex:多个dex文件定义Lorg / apache / commons / logging / Log;添加了两个相同的库。< / p>
当您在主 UI主题上使用 us.authenticate(usr,pw)网络API时。我建议您使用我们的异步API
UserService userService = App42API.buildUserService();
userService.authenticate(userName,pwd,new App42CallBack(){
public void onSuccess(对象响应)
{
用户user =(用户)响应;
System.out.println(&#34; userName是&#34; + user.getUserName());
System.out.println(&#34; sessionId是&#34; + user.getSessionId());
}
public void onException(Exception ex)
{
System.out.println(&#34;异常消息:&#34; + ex.getMessage());
}
});
获得响应后,使用 runOnUIThread 在UI线程上进行更新。
请同时分享一些logcat日志,以帮助我们跟踪确切问题。