2013-05-24 3 views
1

У меня есть полностью функционирующее приложение Java, построенное с помощью платформы libgdx, которая развертывается на рабочем столе. Тем не менее, я хотел бы взять код и создать из него приложение Android.Каковы шаги по преобразованию приложения Desktop в libgdx в android?

Я создал проект Android, перенаправил код в исходную папку Android-проекта, добавил специальный метод Android Specific и отредактировал файл XML-манифеста, чтобы использовать основное действие - в данном случае «RoadRusherActivity». Тем не менее, я бегу в следующее сообщение об ошибке:

04-28 15:44:41.195: E/Trace(2452): error opening trace file: No such file or directory (2) 
04-28 15:44:41.355: D/dalvikvm(2452): Trying to load lib /data/app-lib/com.me.mygdxgame-2/libgdx.so 0x40ce58c8 
04-28 15:44:41.385: D/dalvikvm(2452): Added shared lib /data/app-lib/com.me.mygdxgame-2/libgdx.so 0x40ce58c8 
04-28 15:44:41.415: D/dalvikvm(2452): No JNI_OnLoad found in /data/app-lib/com.me.mygdxgame-2/libgdx.so 0x40ce58c8, skipping init 
04-28 15:44:41.465: D/libEGL(2452): Emulator without GPU support detected. Fallback to software renderer. 
04-28 15:44:41.485: D/libEGL(2452): loaded /system/lib/egl/libGLES_android.so 
04-28 15:44:41.675: D/AndroidRuntime(2452): Shutting down VM 
04-28 15:44:41.675: W/dalvikvm(2452): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
04-28 15:44:41.685: E/AndroidRuntime(2452): FATAL EXCEPTION: main 
04-28 15:44:41.685: E/AndroidRuntime(2452): java.lang.RuntimeException: Unable to resume activity {com.me.mygdxgame/com.me.mygdxgame.RoadRusherActivity}: java.lang.SecurityException: Neither user 10048 nor current process has android.permission.WAKE_LOCK. 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2742) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.Looper.loop(Looper.java:137) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at dalvik.system.NativeStart.main(Native Method) 
04-28 15:44:41.685: E/AndroidRuntime(2452): Caused by: java.lang.SecurityException: Neither user 10048 nor current process has android.permission.WAKE_LOCK. 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.Parcel.readException(Parcel.java:1425) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.Parcel.readException(Parcel.java:1379) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.IPowerManager$Stub$Proxy.acquireWakeLock(IPowerManager.java:271) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.PowerManager$WakeLock.acquireLocked(PowerManager.java:717) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.os.PowerManager$WakeLock.acquire(PowerManager.java:686) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at com.badlogic.gdx.backends.android.AndroidApplication.onResume(AndroidApplication.java:241) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.Activity.performResume(Activity.java:5182) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732) 
04-28 15:44:41.685: E/AndroidRuntime(2452):  ... 12 more 
04-28 15:44:47.705: I/Process(2452): Sending signal. PID: 2452 SIG: 9 

Ниже мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.me.mygdxgame" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".RoadRusherActivity" 
      android:configChanges="orientation|keyboardHidden|screenSize" 
      android:label="@string/app_name" 
      android:screenOrientation="landscape" 
      android:theme="@style/FullscreenTheme" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Ниже мой основной класс деятельности под названием «RoadRusherActivity».

package com.me.mygdxgame; 
import android.os.Bundle; 
import com.badlogic.gdx.backends.android.AndroidApplication; 
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration; 
public class RoadRusherActivity extends AndroidApplication { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    AndroidApplicationConfiguration config = new AndroidApplicationConfiguration(); 
    config.useAccelerometer = false; 
    config.useCompass = false; 
    config.useWakelock = true; 
    config.useGL20 = true; 
    initialize(new SimpleBike(), config); 
} 
} 

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

+1

У вас есть папка 'libs /' с необходимыми баночками? (см. http://code.google.com/p/libgdx/wiki/ProjectSetup) – DannyMo

+0

В каталоге libs возникла проблема с jars. Я исправил эту проблему, и теперь я получаю другое сообщение об ошибке, которое я опубликовал выше. –

+0

Спасибо, дамо, ты был совершенно прав! –

ответ

3

Обновленное исключение идентифицирует проблему:

Caused by: java.lang.SecurityException: Neither user 10048 nor current process has android.permission.WAKE_LOCK. 

Вам просто нужно, чтобы добавить это манифеста:

<uses-permission android:name="android.permission.WAKE_LOCK"/> 

см: https://code.google.com/p/libgdx/wiki/ApplicationConfiguration#Permissions

В качестве альтернативы, если вы не намерены для использования блокировки слежения, удалите линию config.useWakelock = true; от RoadRusherActivity

Обновление: Как уже упоминалось в комментариях ниже, если вы просто хотите сохранить экран, вы должны использовать WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON вместо блокировки бодрствования. Добавьте это к вашему методу onCreate:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 
+3

Игра, в которой используются блокировки волка, чтобы держать экран во время игры, делает это неправильно. Вместо этого вы должны использовать KEEP_SCREEN_ON флаг/setKeepScreenOn (true). Это менее подвержено ошибкам, чем блокировки от бодрствования, и не требует разрешения. – adamp

+0

@adamp Отличная точка, спасибо! Обновлен мой ответ. – DannyMo

+5

Не могли бы вы просто избавиться от части о добавлении разрешения? Вам не нужно это делать, если вы используете флаг окна. Есть слишком много игр в магазине воспроизведения, которые запрашивают это разрешение. :( – hackbod

Смежные вопросы