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