在崩溃Android原生,而更改为新的活动(Crash in Android Native whil

2019-07-29 03:29发布

我的应用程序是无法打开OpenFeint的仪表板的方法。 本地C ++库的实现使用了cocos2d-x作为一个图形库,但它有一个处理器和一个包装允许使用OpenFeint的功能。 OpenFeint的初始化和非活性的方法正常工作。

当UI仪表板的功能,例如openLaderBoards或openAchievements要么从JNI调用或在Java的onCreate初始化,应用程序崩溃调用。

编辑:我已经测试和它发生任何变化的活动我试试,连我自己的新类。

EDIT2:我有一个类似的问题+100赏金,谁的答案上来得到它。

活动:

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
 }

包装:

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);
}

处理器openDashboard功能:

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

表现:

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

堆栈跟踪(不会缩进SO):

http://pastebin.com/jsmSbgw4

Answer 1:

答案很简单,但复杂。 当应用程序改变为新的活动,从cocos2d的-X MessageJNI的nativeOnPause方法被调用。 这种方法应该调用一个CCApplication :: sharedApplication(),但我班的一个以前叫CCApplication析构函数,它清除了共享单为空。

虽然答案很简单修复和具体项目,我会给出什么让我找到了一些建议。 请记住,我所有的工具窗口和Cygwin。

首先,使Eclipse做NDK,建立你干净。

右击你的项目 - >属性 - > C / C ++编译。 生成器设置选项卡,命令

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

其次,设置您的调试器。

使用本教程 。 这可能需要一些时间,并试图去那里,但它是值得的。 我ADB服务器调用脚本

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

第三,在详细设置你的logcat的。

UPDATE:这最后一步,现在可以跳过作为logcat的输出的最新版本的类和线整个堆栈跟踪。

你会得到长期踪迹像在我的问题。 若要检查堆栈跟踪误差点按照这个其他教程。 我的脚本访问库

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


文章来源: Crash in Android Native while changing to new Activity