java - studio - La aplicación se bloquea al cambiar de actividad cocos2d-x a otra actividad en Android
pasar de un activity a otro android studio (2)
Estoy trabajando en un juego de Android que usa el motor de juego Cocos2d-x. La aplicación se inicia con una actividad que me generó cocos2d-x. Lo que quiero hacer es lanzar otra actividad que inicie un explorador de archivos utilizando una llamada JNI a un método de actividad de Cocos que luego usa una intención de cambiar a la actividad del explorador de archivos. La aplicación falla antes de que se abra el explorador de archivos.
Aquí está el código de llamada JNI:
void MusicSelect::HandleYourMusicPressed(CCObject* sender)
{
SimpleAudioEngine::sharedEngine()->playEffect("SFX/select.wav");
JavaVM* jvm = cocos2d::JniHelper::getJavaVM();
if (NULL == jvm)
CCLog("Failed to get the JavaVM");
JNIEnv* env;
jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
if (ret != JNI_OK)
CCLog("Failed to get then JNIEnv");
jclass classRet = env->FindClass("org/cocos2dx/extbeatanni/ExtremeBeatAnnihilation");
if (!classRet)
CCLog("Failed to find class ExtremeBeatAnnihilation");
jmethodID methodRet = env->GetMethodID(classRet, "startupFileExplore", "()V");
if (!methodRet)
CCLog("Failed to find method startupFileExplore");
env->CallVoidMethod(classRet, methodRet);
}
Aquí está la actividad generada Cocos2d-x con startupFileExplore()
como una función que agregué:
public class ExtremeBeatAnnihilation extends Cocos2dxActivity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
private void startupFileExplore()
{
Intent myIntent = new Intent(ExtremeBeatAnnihilation.this, FileExplore.class);
System.out.println("Starting up the activity");
startActivity(myIntent);
}
static {
System.loadLibrary("game");
}
}
Aquí está la actividad del explorador de archivos recortada para mostrar el método onCreate()
:
public class FileExplore extends Activity {
// some class members defined here
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("Inside the onCreate()");
super.onCreate(savedInstanceState);
loadFileList();
showDialog(DIALOG_LOAD_FILE);
Log.d(TAG, path.getAbsolutePath());
}
// some more methods that aren''t necessarily relevant
}
Aquí está mi AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.cocos2dx.extbeatanni"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" />
<uses-feature android:glEsVersion="0x00020000" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name="org.cocos2dx.extbeatanni.ExtremeBeatAnnihilation"
android:configChanges="orientation"
android:label="@string/app_name"
android:screenOrientation="landscape"
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="org.cocos2dx.extbeatanni.FileExplore"
android:label="@string/app_name" >
</activity>
</application>
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true" />
</manifest>
Cuando ejecuto esto, y se llama a la función con el código JNI, solo veo que el Starting up the activity
obtiene salida en logcat, pero nunca veo el resultado de Inside the onCreate()
antes del bloqueo.
He buscado y probado muchas cosas, pero todavía no puedo llegar al fondo de esto. Estoy pensando que puede ser algo extraño con la actividad de los cocos. Los problemas como este nunca son lo que parecen. Por favor, ¿alguien tiene alguna idea de lo que está pasando, o si hice algo mal? ¡Gracias!
EDITAR:
Según lo solicitado, aquí está la salida de logcat. Gracias al comentario de Vikas Patidar, pude comenzar a ver este segfault:
12-12 11:32:37.414: I/DEBUG(28509): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
12-12 11:32:37.414: I/DEBUG(28509): Build fingerprint: ''verizon_wwe/inc/inc:2.3.4/GRJ22/389630.15:user/release-keys''
12-12 11:32:37.414: I/DEBUG(28509): pid: 28510, tid: 28520 >>> org.cocos2dx.extbeatanni <<<
12-12 11:32:37.414: I/DEBUG(28509): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000042
12-12 11:32:37.414: I/DEBUG(28509): r0 00000038 r1 00000002 r2 00000002 r3 00000002
12-12 11:32:37.414: I/DEBUG(28509): r4 44e4754a r5 44e5aee0 r6 44f5a780 r7 000020f8
12-12 11:32:37.414: I/DEBUG(28509): r8 80018380 r9 44e4754a 10 44e5aecc fp 800a73d4
12-12 11:32:37.414: I/DEBUG(28509): ip 000000f8 sp 44f5a730 lr 8001c1ac pc 8001d2a0 cpsr 00000010
12-12 11:32:37.414: I/DEBUG(28509): d0 42156fb442156fe8 d1 42156e7c42156e6f
12-12 11:32:37.414: I/DEBUG(28509): d2 42156ee442156e15 d3 42156f4c42156f42
12-12 11:32:37.414: I/DEBUG(28509): d4 421e17e0421e17ac d5 421e1848421e1814
12-12 11:32:37.414: I/DEBUG(28509): d6 421e18b0421e187c d7 421e1918421e18e4
12-12 11:32:37.414: I/DEBUG(28509): d8 0000000000000000 d9 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d10 0000000000000000 d11 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d12 0000000000000000 d13 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d14 0000000000000000 d15 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d16 0000001040529e50 d17 3fdffffffddaaf00
12-12 11:32:37.414: I/DEBUG(28509): d18 3fe0000000000000 d19 3fe000000112a880
12-12 11:32:37.414: I/DEBUG(28509): d20 0000000000000000 d21 3f872e5c54a96637
12-12 11:32:37.414: I/DEBUG(28509): d22 3e21e7c5992989f4 d23 bda8fae9be8838d4
12-12 11:32:37.414: I/DEBUG(28509): d24 3fc74721cad6b0ed d25 3fc39a09d078c69f
12-12 11:32:37.414: I/DEBUG(28509): d26 0000000000000000 d27 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d28 0000000000000000 d29 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): d30 0000000000000000 d31 0000000000000000
12-12 11:32:37.414: I/DEBUG(28509): scr 80000012
12-12 11:32:37.454: I/DEBUG(28509): #00 pc 0001d2a0 /system/lib/libdvm.so
12-12 11:32:37.454: I/DEBUG(28509): #01 pc 000228ac /system/lib/libdvm.so
12-12 11:32:37.454: I/DEBUG(28509): #02 pc 000217a4 /system/lib/libdvm.so
12-12 11:32:37.454: I/DEBUG(28509): #03 pc 00060b58 /system/lib/libdvm.so
12-12 11:32:37.454: I/DEBUG(28509): #04 pc 0004cf86 /system/lib/libdvm.so
12-12 11:32:37.454: I/DEBUG(28509): #05 pc 00149378 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.454: I/DEBUG(28509): #06 pc 001493fa /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #07 pc 001bb3e6 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #08 pc 001bb45c /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #09 pc 001b9ce6 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #10 pc 001e4bf4 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #11 pc 001e4e02 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #12 pc 001c865c /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #13 pc 001cb104 /data/data/org.cocos2dx.extbeatanni/lib/libgame.so
12-12 11:32:37.464: I/DEBUG(28509): #14 pc 000181b4 /system/lib/libdvm.so
12-12 11:32:37.464: I/DEBUG(28509): code around pc:
12-12 11:32:37.464: I/DEBUG(28509): 8001d280 e2522001 e48a1004 1afffffb e1d030bc
12-12 11:32:37.464: I/DEBUG(28509): 8001d290 ea00001c e1b02627 e245a014 e1d410b4
12-12 11:32:37.464: I/DEBUG(28509): 8001d2a0 e1d090ba e1d030bc 0a000016 e2622005
12-12 11:32:37.464: I/DEBUG(28509): 8001d2b0 e08ff202 eb0000c5 e207cc0f e795232c
12-12 11:32:37.464: I/DEBUG(28509): 8001d2c0 e1a00000 e52a2004 e201ca0f e795252c
12-12 11:32:37.464: I/DEBUG(28509): code around lr:
12-12 11:32:37.464: I/DEBUG(28509): 8001c18c e7952103 e3520000 0a000508 e5922000
12-12 11:32:37.464: I/DEBUG(28509): 8001c19c e5922074 e5054008 e7920101 eb000439
12-12 11:32:37.464: I/DEBUG(28509): 8001c1ac e320f000 e320f000 e320f000 e320f000
12-12 11:32:37.464: I/DEBUG(28509): 8001c1bc e320f000 e1d430b4 e1d410b2 e7952103
12-12 11:32:37.464: I/DEBUG(28509): 8001c1cc e3520000 0a0004f9 e5922000 e5922074
12-12 11:32:37.464: I/DEBUG(28509): stack:
12-12 11:32:37.464: I/DEBUG(28509): 44f5a6f0 80018380 /system/lib/libdvm.so
12-12 11:32:37.464: I/DEBUG(28509): 44f5a6f4 0032a760
12-12 11:32:37.464: I/DEBUG(28509): 44f5a6f8 44e5ae4c
12-12 11:32:37.464: I/DEBUG(28509): 44f5a6fc afd13795 /system/lib/libc.so
12-12 11:32:37.464: I/DEBUG(28509): 44f5a700 0032a760
12-12 11:32:37.464: I/DEBUG(28509): 44f5a704 80055c61 /system/lib/libdvm.so
12-12 11:32:37.464: I/DEBUG(28509): 44f5a708 4051f610
12-12 11:32:37.464: I/DEBUG(28509): 44f5a70c 00000000
12-12 11:32:37.464: I/DEBUG(28509): 44f5a710 00000000
12-12 11:32:37.464: I/DEBUG(28509): 44f5a714 44f5a788
12-12 11:32:37.464: I/DEBUG(28509): 44f5a718 4051f610
12-12 11:32:37.464: I/DEBUG(28509): 44f5a71c 80067bb7 /system/lib/libdvm.so
12-12 11:32:37.464: I/DEBUG(28509): 44f5a720 4271fbe0
12-12 11:32:37.464: I/DEBUG(28509): 44f5a724 44e5ae78
12-12 11:32:37.464: I/DEBUG(28509): 44f5a728 df002777
12-12 11:32:37.464: I/DEBUG(28509): 44f5a72c e3a070ad
12-12 11:32:37.464: I/DEBUG(28509): #00 44f5a730 00000004
12-12 11:32:37.464: I/DEBUG(28509): 44f5a734 44f5a780
12-12 11:32:37.464: I/DEBUG(28509): 44f5a738 00000001
12-12 11:32:37.464: I/DEBUG(28509): 44f5a73c 00334060
12-12 11:32:37.464: I/DEBUG(28509): 44f5a740 0032a768
12-12 11:32:37.464: I/DEBUG(28509): 44f5a744 000171a8
12-12 11:32:37.464: I/DEBUG(28509): 44f5a748 800acdc8
12-12 11:32:37.464: I/DEBUG(28509): 44f5a74c fffffe78
12-12 11:32:37.474: I/DEBUG(28509): 44f5a750 800a73d4
12-12 11:32:37.474: I/DEBUG(28509): 44f5a754 800228b0 /system/lib/libdvm.so
12-12 11:32:37.474: I/DEBUG(28509): #01 44f5a758 44f5a780
12-12 11:32:37.474: I/DEBUG(28509): 44f5a75c 0032a760
12-12 11:32:37.474: I/DEBUG(28509): 44f5a760 80022820 /system/lib/libdvm.so
12-12 11:32:37.474: I/DEBUG(28509): 44f5a764 42361bd0
12-12 11:32:37.474: I/DEBUG(28509): 44f5a768 00000000
12-12 11:32:37.474: I/DEBUG(28509): 44f5a76c 800217a8 /system/lib/libdvm.so
Descubrí qué está causando el bloqueo. En mi código JNI en la línea env->CallVoidMethod(classRet, methodRet);
, Le paso el jclass
que apunta a la clase ExtremeBeatAnnihilation
. Esta no debería ser la jclass
. Esto debería ser realmente un jobject
que apunta a la instancia de la actividad de ExtremeBeatAnnihilation
actualmente en ejecución. Como tenía esto mal, llamaba al método en una instancia aleatoria y no en la instancia en ejecución, por lo que el intento de cambiar actividades cuando no estaba dentro de la actividad de ejecución provocó su bloqueo.
EDITAR:
A petición, aquí está el código de trabajo para las actividades de conmutación usando llamadas JNI desde Android nativo (Esto se modifica desde mi código para ser más general, así que avíseme si hay errores):
JNIEnv* env;
JavaVM* jvm = cocos2d::JniHelper::getJavaVM();
if (NULL == jvm)
CCLog("Failed to get the JavaVM");
jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
if (ret != JNI_OK)
CCLog("Failed to get then JNIEnv");
jclass myClass = env->FindClass("org/cocos2dx/extbeatanni/ExtremeBeatAnnihilation");
if (!myClass)
CCLog("Failed to find class ExtremeBeatAnnihilation");
jmethodID getObjectMethod = env->GetStaticMethodID(myClass, "getObject", "()Ljava/lang/Object;");
if(!getObjectMethod)
CCLog("Failed to find method getObject");
jobject myInstance = env->CallStaticObjectMethod(myClass, getObjectMethod);
if(!myInstance)
CCLog("Failed to get the current instance of the running activity");
jmethodID startupFileExploreMethod = env->GetMethodID(myClass, "startupFileExplore", "()V");
if (!startupFileExploreMethod)
CCLog("Failed to find method startupFileExplore");
// call the java method within the ExtremeBeatAnnihilation activity that will start up file explore
env->CallNonvirtualVoidMethod(myInstance, myClass, startupFileExploreMethod);
El código Cocos2dxActivity
:
public class ExtremeBeatAnnihilation extends Cocos2dxActivity{
private static final int REQUEST_SONG_FILE = 0; // flag for file explore to return a selected song
private static Object activity; // current running instance of this activity
private String selectedSong; // song that was selected in the file explorer
// called on the startup of the game; will save the instance created to be returned later
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
activity = this;
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
// returns the currently running instance of this activity
public static Object getObject()
{
Log.i("cppCall", "Returning activity");
return activity;
}
// starts the file explore activity to allow the user to choose a song on their SD card
public void startupFileExplore()
{
try
{
Intent fileExploreIntent = new Intent(ExtremeBeatAnnihilation.this, FileExplore.class);
if(fileExploreIntent != null)
{
startActivityForResult(fileExploreIntent, REQUEST_SONG_FILE);
}
else
{
Log.d("Extreme Beat Annihilation", "FileExploreIntent null/n");
}
}
catch(Exception e)
{
Log.d("Extreme", "Error" + e.getMessage());
}
}
// returns the selected song
public String getSelectedSong()
{
return selectedSong;
}
// called when returning from the file explore; gets the selected song that was returned
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_SONG_FILE)
{
selectedSong = data.getStringExtra("Song File");
}
}
static {
System.loadLibrary("game");
}
}
Necesita traducir la salida de Logcat a la más legible, y puede consultar http://www.cocos2d-x.org/forums/6/topics/46225