android android-ndk openfeint cocos2d-x

Accidente en Android nativo al cambiar a una nueva actividad



android-ndk openfeint (1)

La respuesta fue fácil pero compleja. Cuando la aplicación cambia a una nueva actividad, se llama al método nativeOnPause de cocos2d-x MessageJNI. Se supone que este método llama a CCApplication :: sharedApplication (), pero una de mis clases había llamado previamente al destructor CCApplication, que quitó el singleton compartido a nulo.

Aunque la respuesta es fácil de solucionar y específica del proyecto, voy a dar algunos consejos sobre lo que me hizo encontrarla. Tenga en cuenta que todas mis herramientas son Windows y Cygwin.

Primero, haz que Eclipse haga las ndk-builds en limpio.

Haga clic derecho en su Proyecto-> Propiedades-> C / C ++ Build. Pestaña Configuraciones del constructor, comando

C:/NVPACK/cygwin/bin/bash.exe -c "cd /cygdrive/path/to/project && ./build_script.sh"

En segundo lugar, configure su depurador.

Usando este tutorial . Puede tomar algún tiempo e intenta llegar pero vale la pena. Mi script de llamada de adb-server es

export ANDROID_NDK_ROOT=/cygdrive/c/NVPACK/android-ndk-r6b/ cd $ANDROID_NDK_ROOT ./ndk-gdb-eclipse --adb=/cygdrive/c/NVPACK/android-sdk-windows/platform-tools/adb --project=/cygdrive/c/project/path --force --verbose

En tercer lugar, configure su logcat en verboso.

ACTUALIZACIÓN: este último paso ahora se puede omitir ya que las últimas versiones de Logcat generan la clase y la línea para toda la pila.

Obtendrás trazas largas como la de mi pregunta. Para verificar dónde se encuentran los errores de stacktrace, siga este otro tutorial. Mi script para acceder a la biblioteca es

C:/NVPACK/android-ndk-r6b/toolchains/x86-4.4.3/prebuilt/windows/bin/i686-android-linux-addr2line.exe -C -f -e c:/path/to/project/libMyLib.so

Mi aplicación no puede abrir los métodos del panel de OpenFeint. La implementación de las bibliotecas c ++ nativas usa cocos2d-x como una biblioteca gráfica, pero tiene un controlador y un contenedor para permitir el uso de las funciones de OpenFeint. Los métodos de inicialización y no actividad de OpenFeint funcionan correctamente.

Cuando las funciones del tablero de la interfaz de usuario como openLaderBoards o openAchievements se llaman desde una llamada Jni o en la inicialización de Java onCreate, la aplicación se bloquea.

EDIT: he probado y sucede con cualquier cambio de actividad que intente, incluso mis propias clases nuevas.

EDIT2: Tengo una recompensa de +100 en una pregunta similar, cualquiera que se le ocurra la respuesta lo consigue.

Código

Actividad:

public class App extends Cocos2dxActivity{ private Cocos2dxGLSurfaceView mGLView; OpenFeintX m_kOpenFeintX; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); // get the packageName,it''s used to set the resource path String packageName = getApplication().getPackageName(); super.setPackageName(packageName); InternetConnection.setM_kActivity(this); m_kOpenFeintX = new OpenFeintX( this); setContentView(R.layout.applayout); mGLView = (Cocos2dxGLSurfaceView) findViewById(R.id.game_gl_surfaceview); mGLView.setTextField((EditText)findViewById(R.id.textField)); // Testspace for new Activities, OpenFeint or self-made // // Intent myIntent = new Intent(this, TestActivity.class); // startActivityForResult(myIntent, 0); // Dashboard.open(); // Cocos2d-x scene opens after this } static { System.loadLibrary("TestProject"); // Native library loaded for cocos2d-x }

Envoltura:

public class OpenFeintX { private static OpenFeintXHandler ms_kOpenFeintHandler; public OpenFeintX(Activity kActivity) { initializeOpenFeint("TestApp", "derp", "hurr", "6546516516541", kActivity, ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); ms_kOpenFeintHandler = new OpenFeintXHandler(); } public static void openLeaderBoards() { Message msg = new Message(); msg.what = OpenFeintXHandler.SHOW_LEADERBOARDS; ms_kOpenFeintHandler.sendMessage(msg); }

Función del manejador openDashboard:

private void openLeaderBoards() { System.out.println("Opening Dashboard"); Dashboard.openLeaderboards(); }

Manifiesto:

<application android:debuggable="true" android:label="@string/app_name"> <activity android:configChanges="orientation" android:label="@string/app_name" android:name=".App" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.openfeint.internal.ui.IntroFlow" android:label=".IntroFlow" android:configChanges="orientation|keyboardHidden" android:theme="@style/OFNestedWindow" /> <activity android:name="com.openfeint.api.ui.Dashboard" android:label=".Dashboard" android:configChanges="orientation|keyboardHidden" android:theme="@style/OFNestedWindow"/> <activity android:name="com.openfeint.internal.ui.Settings" android:label=".Settings" android:configChanges="orientation|keyboardHidden" android:theme="@style/OFNestedWindow"/> <activity android:name="com.openfeint.internal.ui.NativeBrowser" android:label=".NativeBrowser" android:configChanges="orientation|keyboardHidden" android:theme="@style/OFNestedWindow"/> </application>

Stacktrace (no sangrará en SO):

http://pastebin.com/jsmSbgw4