2014年11月22日 星期六

Cocos2d-x NDK 堆疊追蹤

又收到了堆疊追蹤以及使用者訊息的熱情回應(疑?不是痛駡嗎?)
堆疊追蹤如下:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/hlltezt/hllte:4.3/JSS15J/N7507ZTUANJ1:user/release-keys'
Revision: '10'
pid: 29894, tid: 29908, name: Thread-3236 >>> chad.game.mahjongtycoon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Abort message: 'stack corruption detected'
r0 00000027 r1 00000000 r2 00000008 r3 deadbaad
r4 00000000 r5 5fcc0544 r6 6371322c r7 63712920
r8 5fcc0c6c r9 5bdf1f00 sl 5bd97a98 fp 5fcc0c84
ip 00000001 sp 5fcc0540 lr 4004d3f7 pc 4004a930 cpsr 600a0030
d0 6f63206b63617473 d1 6e6f697470757272
d2 3fe62e4300000000 d3 3e335cbaa3698400
d4 3fe62e42fefa39ef d5 3f2a7a71c7316a74
d6 3f8d24a15045f000 d7 00000000ba4befdc
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 3f903ab3ef110182 d17 3f2a8a8f10be2c73
d18 3e66376972bea4d0 d19 be205c610ca86c39
d20 3e2a817ff707bd4a d21 bec5090c00000000
d22 bf66c164e61cb166 d23 3f903ab3ef110182
d24 3fc555509d6ae6af d25 bf8d59f78880c128
d26 bf1aaae71a68a5df d27 bfffc5da1fed000f
d28 bf1aaae71a68a5cf d29 3f8d12f0097ff874
d30 3ff0000000000000 d31 3e2a817ff7000000
scr 80000010

backtrace:
#00 pc 0001e930 /system/lib/libc.so
#01 pc 0001c944 /system/lib/libc.so (abort+4)
#02 pc 00012325 /system/lib/libc.so
#03 pc 000117ff /system/lib/libc.so (__stack_chk_fail+6)
#04 pc 00207691 /data/app-lib/chad.game.mahjongtycoon-1/libcocos2dcpp.so (TableLayout::CalculateWinScore(unsigned char)+276)

code around pc:
4004a910 461ce00b 2b006823 e026d1fb b12468e4 
4004a920 21014a18 6011447a 4b1247a0 24002027 
4004a930 f7fc7018 2106ed3c e88ef7fe 5180f04f 
4004a940 94022006 91049403 460aa902 eb3ef7fd 
4004a950 46224629 f7fd2002 f7fceb4a 2106ed28 
4004a960 e87af7fe f7fc2001 6960e9d4 d1dc2800 
4004a970 bf00e7d4 deadbaad 000296e2 ffffff9c 
4004a980 0002c978 0002c95c b088b510 46692400 
4004a990 aa049002 94014620 94039400 ea8cf7fd 
4004a9a0 db0642a0 b1139b07 1c419806 98069106 
4004a9b0 4620e000 bd10b008 4b1eb40e b5f0491e 
4004a9c0 af00b082 f107447b 585e021c f8522101 
4004a9d0 68354b04 f852607d 31015b04 d1fa2d00 
4004a9e0 320e008a 0507f022 0220f107 0d05ebad 
4004a9f0 4669603a 0224f107 9400466d 4c04f852 
4004aa00 f8453204 2c004f04 f8dfd1f8 f853c030 

code around lr:
4004d3d4 4a0e4b0d 41f0e92d 26004680 589c447b 
4004d3e4 686768a5 f9b5e007 2b00300c 4628dd02 
4004d3f4 430647c0 3f013554 6824d5f5 d1ef2c00 
4004d404 e8bd4630 bf0081f0 00026bf4 ffffffc4 
4004d414 43f0e92d 4b16461e fb01b087 460ff502 
4004d424 46144914 aa019001 95022001 9203447b 
4004d434 90049505 681a585b b1124698 f0094630 
4004d444 4630fd18 f7ffa903 4681fe9c 0000f8d8 
4004d454 4630b110 fd1af009 0f00f1b9 9c05d003 
4004d464 fbb11b29 4620f4f7 e8bdb007 bf0083f0 
4004d474 00026ba4 ffffff60 46036842 29001e51 
4004d484 da016041 bbbaf000 f8126802 601a0b01 
4004d494 00004770 4a104b0f 4604b570 589b447b 
4004d4a4 461e6819 f009b109 6860fce4 2d001e45 
4004d4b4 da046065 f0004620 4605fba1 6822e003 
4004d4c4 5b01f812 68336022 4620b113 fcdef009

這不容易查,需要做個轉換(每個人開發環境不同,要自行變通一下)
1.將上頭的訊息copy到android-ndk-r9d下存成a.txt
2.到android-ndk-r9d目錄
3.執行
./ndk-stack -sym 你的專案目錄/proj.android/obj/local/armeabi -dump a.txt > b.txt

這裡要注意armeabi目錄,若當初是編出x86要改掉

4.得到b.txt如下:
********** Crash dump: **********
Build fingerprint: 'samsung/hlltezt/hllte:4.3/JSS15J/N7507ZTUANJ1:user/release-keys'
pid: 29894, tid: 29908, name: Thread-3236 >>> chad.game.mahjongtycoon <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
Stack frame #00 pc 0001e930 /system/lib/libc.so
Stack frame #01 pc 0001c944 /system/lib/libc.so (abort+4)
Stack frame #02 pc 00012325 /system/lib/libc.so
Stack frame #03 pc 000117ff /system/lib/libc.so (__stack_chk_fail+6)
Stack frame #04 pc 00207691 /data/app-lib/chad.game.mahjongtycoon-1/libcocos2dcpp.so (TableLayout::CalculateWinScore(unsigned char)+276): Routine TableLayout::CalculateWinScore(unsigned char) at /media/windows/xpdata/androidwork/MahjongTycoon/proj.android/jni/../../Classes/TableLayout.cpp:2052

唔,這樣查起來比較就比較有線索了。

2014年10月16日 星期四

cocos2d-x proguard 設定

使用cocos2d-x開發的確方便,只是有時也會使用java的程式碼,那proguard檔要如何設定呢?如下把整個檔都貼出來方便大家參考。若是有用到其它的庫可要自行加上去


-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

# cocos2dx
-keepclassmembers public class org.cocos2dx.lib.* {
    *;
}  




2014年6月12日 星期四

RakNet for Android NDK make libRakNet.so

其實 RakNet 的 readme.txt 已經有說明如何編出 .so 檔了,但那是在window平台的做法, 以下是linux下的做法。
1.在 android ndk 目錄下的 samples 內建個資料夾 RakNet/jni/RakNetSources

2. RakNet/jni 下加個 Android.mk 檔,內容填入 readme.txt 內所說明的內容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := RakNet
MY_PREFIX := $(LOCAL_PATH)/RakNetSources/
MY_SOURCES := $(wildcard $(MY_PREFIX)*.cpp)
LOCAL_SRC_FILES += $(MY_SOURCES:$(MY_PREFIX)%=RakNetSources/%) 
include $(BUILD_SHARED_LIBRARY)

3.找到RakNet原始碼(在Source內),copy到剛才建的目錄RakNetSources內。

4.於剛才建的目錄jni內執行 ndk-build 命令,產生libRakNet.so後成功。

迷之音:不是比window平台簡單嗎?這也要說明?

2014年4月26日 星期六

android ProGuard 後的 debug

看著google後台的call stack,發現自己又忘了要如何處置了,再記下來好了,不然每次都要到處找。
工具是 android-sdks/tools/proguard/bin/proguardgui.sh
執行後如下:
最左邊選ReTrace
上方Mapping file 選專案內的proguard/mapping.txt
Obfuscated stack trace 就貼上收到的call stack
最後按下右下方的 ReTrace!
然後就可以快樂地?除錯了哦

2014年4月19日 星期六

eclipse 錯誤訊息 Unable to execute dex: GC overhead limit exceeded

其實和網路上找到的解法大同小異,但還是做個記錄。
1.找出eclipse.ini文件,因為我是在ubuntu下,所以是放在/etc 內
2.找到 --launcher.XXMaxPermSize 這行,把下一行的256m(數值可能會不同)改為512m
3.找到以下3行 
-vmargs
-Xms256m
-Xmx512m
其中的數值可能會不一樣,把後頭2行的數值加大,例如
-Xms512m
-Xmx1024m
4.找到 -XX:MaxPermSize=256m (數值可能不同) ,一樣數值加大,例如
-XX:MaxPermSize=512m

2014年3月2日 星期日

java Could not find class

下載了 photon server 的 android client 範例,編釋上沒什麼問題,只是執行後會出現如下錯誤:
Could not find class 'de.exitgames.demo.loadbalancing.ClientDemo', referenced from method de.exitgame.demo.loadbalancing.ApplicationManager.<client>

也出現了這種錯誤,後頭訊息就不打出來了
java.lang.NoClassDefFoundError:
本來以為沒什麼,google後一狗票的解決方法,試了一整天,竟解決不了,都快放棄了。最後試了在專案放jar庫的地方,也就是libs上
按右鍵->build path->use as source folder,選擇後就解決了。

但最吐血的還不在這,原本想好好做個記錄,讓有碰到相同問題的朋友們不要像我一樣浪費整天的時間,於是把專案砍掉,重新滙入,準備把錯誤
詳細記下,結果好像從來沒發生過似的,這個問題消失了,也不用按右鍵去選 use as source folder ,真是令人無言。

2014年1月31日 星期五

Pyro Particle Editor SetLocalMatrix 矩陣用法

最近在工作上使用了 Pyro Particle Editor     官網在這:http://pyro.fenomen-games.com/

可能有點冷門吧,它的SDK使用在網路上查不到什麼教學,只能看裡面的範例寫程式,但範例只有寫到CPyroEmitter控制XY來改變位置,那旋轉或縮放呢?

在IPyroParticleEmitter類別內確實是有一些控制的函數,不過只用上SetLocalMatrix就很好用了,可是參數const float m[3][4]要怎麼填?

我以D3DX的D3DXMATRIX為例子:

//宣告D3D的矩陣
D3DXMATRIX Mat;

//之後Mat填入或計算自己想要的移動旋轉或縮放


//Mat算好後,依下面順序填入
float m[3][4]={{Mat._11,Mat._21,Mat._31,Mat._41},
{Mat._12,Mat._22,Mat._32,Mat._42},
{Mat._13,Mat._23,Mat._33,Mat._43},};

//在類別render之前呼叫SetLocalMatrix 即可
m_pEmitter->SetLocalMatrix(m);
m_pEmitter->Render();

依每個人不同的用法,要改一下程式,我是直接在CPyroEmitter類別加上void Render(float m[3][4])
{
if( m_pEmitter ){
m_pEmitter->SetLocalMatrix(m);
m_pEmitter->Render();
}
}

但重點就是矩陣填入的方式,我一開始填成Mat._11,Mat._12的順序,浪費不少時間,這邊做個記錄,說不定也可以幫到別人。


2014年1月11日 星期六

onActivityResult 無法接收到 resultCode與data

今日快樂的使用onActivityResult時,竟然收到resultCode=0與data=null。
不過requestCode到是正常,這可怪了,之前可用得好好的,網上查了一下,也沒找到答案。

想了想,這次使用setResult的時機是在onDestroy內呼叫的,會不會是這個原因呢?以往都是按下button才呼叫setResult,之後接著finish();離開這個Activity,這次剛好想在onDestroy才回傳,結果失敗了。

也有試著在onStop內做同樣的事,也是失敗,會不會onStop與onDestroy內原本就不能做setResult呢?

當然啦,細節還是以後再想,先解決問題,就先不要在onDestroy內呼叫setResult。改成在keyDown內呼叫,程式碼如下:
public boolean onKeyDown(int keyCode, KeyEvent e) {
    if(keyCode == KeyEvent.KEYCODE_BACK && 0==e.getRepeatCount() )        {
    Intent intent = new Intent();
    Bundle bundleBack = new Bundle();
    bundleBack.putInt("val", "100");
    intent.putExtras(bundleBack);      
    setResult(RESULT_OK, intent);
     finish();
    }
    return false;
}