2013年1月16日 星期三

Output Debug String

As we know, we can use API OutputDebugString to show string on output window, like,

OutputDebugString(" This is debug message. ");
OutputDebugStringW(L" This is debug message. ");

You also can attach some variable to the output string.

wchar_t* world = L"world";
wchar_t* szBuffer = new wchar_t[512];
wsprintf(szBuffer, _T(" Hello %s \n"),  world);
OutputDebugString(szBuffer);
delete[] szBuffer;

or

wchar_t* message = L"world !";

wchar_t* str = L" Hello ";
wchar_t* buffer = new wchar_t[sizeof(str)+sizeof(message)+1];
wcscpy(buffer, str);
wcscat(buffer, message);
OutputDebugStringW(buffer);


or

float value = 100;
wchar_t* szBuffer = new wchar_t[512];
wsprintf(szBuffer, L" My math grade is %d \n",   (int)value);
OutputDebugString(szBuffer);
delete[] szBuffer;

or

float value = 100;
char* szBuffer = new char[512];
sprintf(szBuffer, L" My math grade is %f \n",  value);
OutputDebugStringA(szBuffer);
delete[] szBuffer;




2013年1月15日 星期二

[Platform Builder] Output Logging Message to File

As we all know, there are lots of useful message shown in output window.
The window doesn't has huge buffer to keep all of messages.













We can try to output it to file and check it later.
Click Target->Debug Message Options->Check Send to file and specify file path









2012年12月8日 星期六

[AOSP] Build Android Framework

Just brief note the steps to build AOSP

PC: i5-3210, 8G RAM, 750G HD
OS: Ubuntu 10.04 64 bits on VM WorkStation 8.0
Code Name: Jelly Bean
Tag: android-4.1.2_r1

Set up environment  ===========
1. Install Ubuntu 10.04 64 bits.
       http://releases.ubuntu.com/lucid/

2. Install Python.
$ sudo apt-get install python.
 
3. Install make
$ sudo apt-get update
$ sudo apt-get install gcc g++ build-essential
 
4. Install JDK6
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

 * If you got message below in step 4:
   Package sun-java6-jdk is not available, but is referred to by another package.
   This may mean that the package is missing, has been obsoleted, or
   is only available from another source
   E: Package 'sun-java6-jdk' has no installation candidate

 * Use following command instead
$ sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

5. Install git
$ sudo apt-get install git-core

6. Install Required Package
$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc

7. Configuring USB Access
$ sudo gedit /etc/udev/rules.d/51-android.rules

 * Paste following text into the editing file and replace <username> to actual username

# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"


  * After you save the file, execute following command.
    $ sudo chmod a+r /etc/udev/rules.d/51-android.rules

8. Setting up ccache
$ export USE_CCACHE=1


Download source  ============
1. Create a bin/ directory in home directory and make it included in path.
$ mkdir ~/bin
$ PATH=~/bin:$PATH

2. Download the Repo script
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

3. Create a working directory, the name is up to you.
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

4. Run repo init
$ repo init -u https://android.googlesource.com/platform/manifest

5. Check out branch
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.2_r1

6. Start to download
$ repo sync

7. Verifying Git Tags, I don't know what the step for.
$ gpg --import

  * Paste following text, then enter Ctrl-D

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2 (GNU/Linux)

mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----


Build   ===================
1. Set up environment
        $ . build/envsetup.sh

2. Choose a Target
        $ lunch full-eng

3. Build
        $ make -j4

The building process is done if you see message below.
Install system fs image: out/target/product/generic/system.img


Run on emulator  ===========
1. Boot up emulator.
        $ emulator


Reference:
http://source.android.com/source/index.html

[AOSP] make: *** [out/host/common/obj/JAVA_LIBRARIES/smali_intermediates/smaliLexer.java]

Problem:
When I built Android Frame android-4.1.2_r1 on Ubuntu, I got the error message below.

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Vector.<init>(Vector.java:111)
at java.util.Vector.<init>(Vector.java:124)
at org.antlr.analysis.DFA.createTransitionTableEntryForState(DFA.java:551)
at org.antlr.analysis.DFA.createStateTables(DFA.java:440)
at org.antlr.codegen.CodeGenerator.genLookaheadDecision(CodeGenerator.java:645)
at org.antlr.grammar.v3.CodeGenTreeWalker.block(CodeGenTreeWalker.java:2876)
at org.antlr.grammar.v3.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:2382)
at org.antlr.grammar.v3.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:1537)
at org.antlr.grammar.v3.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:1441)
at org.antlr.grammar.v3.CodeGenTreeWalker.grammar_(CodeGenTreeWalker.java:461)
at org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:421)
at org.antlr.Tool.generateRecognizer(Tool.java:655)
at org.antlr.Tool.process(Tool.java:468)
at org.antlr.Tool.main(Tool.java:93)
make: *** [out/host/common/obj/JAVA_LIBRARIES/smali_intermediates/smaliLexer.java] Error 1
make: *** Waiting for unfinished jobs....



Solution:
Open file in  
external/smali/smali/Android.mk
Find the line 
$(GEN): PRIVATE_CUSTOM_TOOL = java -jar $(ANTLR_JAR) -fo $(dir $@) $<
Change it to 
$(GEN): PRIVATE_CUSTOM_TOOL = java -Xmx512m -jar $(ANTLR_JAR) -fo $(dir $@) $<


Reference:
https://groups.google.com/forum/#!msg/android-building/Or1C6bpq8GQ/xAEMEEM0gKAJ


**********************************************************************
Related issues:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.lang.String.toCharArray(String.java:2726)
at java.util.zip.ZipOutputStream.getUTF8Bytes(ZipOutputStream.java:483)
at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:348)
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:179)
at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
at com.android.tools.layoutlib.create.AsmGenerator.createJar(AsmGenerator.java:241)
at com.android.tools.layoutlib.create.AsmGenerator.generate(AsmGenerator.java:225)
at com.android.tools.layoutlib.create.Main.main(Main.java:98)
make: *** [out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar] Error 1
make: *** Deleting file `out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar'

Edit the file
frameworks/base/tools/layoutlib/Android.mk

Reference:
https://groups.google.com/forum/?fromgroups=#!topic/android-building/D3QmmvsMRME


2012年12月7日 星期五

error LNK2005: * already defined in *.lib(*.obj)

Problem:
When I build Seahorse in branch bsquare, sometimes I got lots of linking error like this
error LNK2005: * already defined in *.obj
I’m sure it had been successful built before, but it doesn’t work now.


Solution:
I found it can be avoid if putting /FORCE:MULTIPLE into build options.
Right click on project -> Properties -> Linker -> Command Line -> Additional Options -> add /FORCE:MULTIPLE

(It just a first-add, please see the first reference for root cause.)


Reference:
http://stackoverflow.com/questions/10046485/error-lnk2005-already-defined
http://bbs.csdn.net/topics/260087335

2012年11月27日 星期二

[Webkit] KeywordLookupGenerator.py throws error of "expected description ending with @end"

Problem:
Python throw an exception from file KeywordLookupGenerator.py.
According to building log, it run into error at line 79.
I found that is a ending issue.

Solution:

In line 79 of my KeywordLookupGenerator.py:
    if not terminator == "@end"

Change it to:
    if not terminator.rstrip() == "@end"



Reference:
https://lists.webkit.org/pipermail/webkit-unassigned/2011-June/340772.html

2012年11月8日 星期四

[CMake] Error: The source "Path1/CMakeLists.txt" does not match the source "Path2/CMakeLists.txt" us ed to generate cache.

Error:

CMake Error: The source "Path1/CMakeLists.txt" does not match the source "Path2/CMakeLists.txt" used to generate cache.  Re-run cmake with a different source directory.

Solution:
Delete CMakeCache.txt in the target folder.



2012年11月7日 星期三

error C2731: 'WinMain' : function cannot be overloaded

Error message as title.

My code as below.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)

{
    bala...bala...
}

To fix the issue, change code to
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
    bala...bala...
}

2012年11月3日 星期六

fatal error LNK1181: cannot open input file 'mmtimer.lib'

Error:
fatal error LNK1181: cannot open input file 'mmtimer.lib

Solution:
mmtimer.lib is for OS WinCE
For Windows, It should be winmm.lib

1. go to Project properties->Linker->input
2. remove mmtimer.lib and put winmm.lib instead.

Reference:
http://www.programmer-club.com/showSameTitleN/directx/5570.html

error C3861: '_ASSERTE': identifier not found


Error:
error C3861: '_ASSERTE': identifier not found

Solution:
The reason for this is, there is a crtdbg.h in project. so #include crtdbg.h goes to own crtdbg.h

1. In my case, tt is caused _ASSERTE doesn't defined in wceshunt.
    Please remove path wceshunt\include from include directories.

2. If the path already be removed, such as project icu.
    Please add C:\Program Files\Microsoft Visual Studio 9.0\VC\include to include directories. It should be added ahead wceshunt\include if you don't remove wceshunt from include directories.