Android 프로그래밍을 하다 C코드를 Java코드와 연동해야하는 일이 생겼습니다.

Android NDK를 이용해 빌드하다보니 ant를 사용하여 안드로이드 프로그램을 빌드하였습니다.

Linux에서 빌드할때와 Mac OSX에서 빌드할때 미묘한 차이가 생기더군요.


Java로 된 안드로이드 소스코드는 UTF-8로 분명히 저장되어 있는데, Ant가 Linux에서 돌릴때엔 ascii로 인식해서 컴파일을 하더군요. 결국엔 안드로이드 어플에 한글이 깨져 나오는 문제가 있습니다.

Mac에서는 아무런 문제없이 빌드되고 안드로이더 어플에 한글이 깨져나오는 일이 없습니다. 참 미묘하기도 하지요?


참고로 CentOS5에 설치한 Ant 버전은 아래와 같습니다.

[studioego@localhost ~]$ ant -version

Apache Ant version 1.7.1 compiled on June 27 2008

[studioego@localhost ~]$ 



그리고 Mac  OSX 10.6에 설치된 Ant버전은 아래와 같다.

Dae-Hyun-Sung-ui-MacBook-Pro:~ studioego$ ant -version

Apache Ant version 1.8.1 compiled on September 21 2010

Dae-Hyun-Sung-ui-MacBook-Pro:~ studioego$


CentOS5 에서 Ant를 실행했을때


$ ant debug

Buildfile: build.xml

    [setup] Android SDK Tools Revision 8

    [setup] Project Target: Android 2.2

    [setup] API level: 8

    [setup] 

    [setup] ------------------

    [setup] Resolving library dependencies:

    [setup] No library dependencies.

    [setup] 

    [setup] ------------------

    [setup] 

    [setup] 

    [setup] Importing rules file: tools/ant/main_rules.xml


-debug-obfuscation-check:

-set-debug-mode:

-compile-tested-if-test:

-dirs:

     [echo] Creating output directories if needed...

    [mkdir] Created dir: /******/bin/classes

-pre-build:

-resource-src:

     [echo] Generating R.java / Manifest.java from the resources...

     [null] /home/studioego/android/platform-tools/aapt: /usr/lib/libz.so.1: no version information available (required by /home/studioego/android/platform-tools/aapt)

-aidl:

     [echo] Compiling aidl files into Java classes...

-pre-compile:

compile:

    [javac] Compiling 5 source files to /******/bin/classes

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]            ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]             ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]              ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]               ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                 ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                  ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                   ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                    ^

    [javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii

    [javac] // 시작점 좌표

    [javac]                      ^

(생략)

    [javac] 100 warnings

(생략)



이후 소스코드는 UTF-8로 분명히 저장했는데도 안드로이드 어플에서 글씨가 깨져 나옵니다.


Mac OSX 10.6 Snow Leopard 에 탑재된 Ant를 실행했을때

$ ant debug

Buildfile: /******/build.xml

    [setup] Android SDK Tools Revision 10

    [setup] Project Target: Android 2.2

    [setup] API level: 8

    [setup] 

    [setup] ------------------

    [setup] Resolving library dependencies:

    [setup] No library dependencies.

    [setup] 

    [setup] ------------------

    [setup] 

    [setup] 

    [setup] Importing rules file: tools/ant/main_rules.xml

-debug-obfuscation-check:

-set-debug-mode:

-compile-tested-if-test:

-pre-build:

-dirs:

     [echo] Creating output directories if needed...

-aidl:

     [echo] Compiling aidl files into Java classes...

-renderscript:

     [echo] Compiling RenderScript files into Java classes and RenderScript bytecode...

-resource-src:

     [echo] Generating R.java / Manifest.java from the resources...

-pre-compile:

...

(생략)

BUILD SUCCESSFUL

Total time: 10 seconds


소스코드도 UTF-8로 저장되었고 안드로이드 어플에서 한글이 깨지는 일이 없이 문제 없이 돌아갑니다. 


ant의 버전 차이때문에 그런건가요?


이 문제 때문에 Linux용 최신 ant binary 버전을 다운 받아서 사용했어도 똑같은 일이 발생하더군요.

버전문제는 아는 것 같고.. Linux용 ant를 직접 빌드해서 사용해야 문제가 해결될까요?


한글이 깨지는 문제때문에 구글링 한 결과 android-sdk폴더안의 파일을 수정해야되더군요

android-sdk디렉토리 안에 있는 tools/ant/main_rules.xml 을 열고 나서 

<property name="java.encoding" value="ascii" /> 부분을 찾습니다. 

 120     <!-- compilation options -->

 121     <property name="java.encoding" value="ascii" />

 122     <property name="java.target" value="1.5" />

 123     <property name="java.source" value="1.5" />

이후 ascii를 UTF-8로 수정후 저장합니다.

 <property name="java.encoding" value="UTF-8" />

이후에 다시 ant로 안드로이드 어플 컴파일 하면 한글이 깨지는 문제가 사라집니다.

참조: android: getting rid of “warning: unmappable character for encoding ascii”

(역시 구글링하면 모든 문제가 대부분 해결 되더군요 ㅎㅎ)


참고로 Mac OSX에선 기본적으로 UTF-8로 설정되어서 위와 같이 한글이 깨지는 문제가 없더군요.

아래는 맥의 ant 설정파일의 내용입니다.

/Users/studioego/android-sdk-mac_86/tools/ant/main_rules.xml

124     <!-- compilation options -->

125     <property name="java.encoding" value="UTF-8" />

126     <property name="java.target" value="1.5" />

127     <property name="java.source" value="1.5" />


Buy me a coffeeBuy me a coffee


하루종일 Android OS에서 C/C++코드와 Java 코드를 연동하기 위해서 Android NDK를 사용하여 프로그래밍중입니다.

C/C++로 개발된 기능을 Java에서 쓰기 위해서 JNI(Java Native Interface)를 사용해야되긴 하지만 처음 접하니 어렵군요.

분명히 Visual Studio에서 빌드하여 성공한 코드가 JNI(Java Native Interface)로 빌드할땐 에러가 나니 짜증이 나군요.


ps. 2011년 2월 21일 오후 5시 18분경 컴파일 성공. 이제 마무리 작업만 하면 됩니다 ~_~





Buy me a coffeeBuy me a coffee

출처: Android DevelopersWhat is the NDK?


Android NDK는 안드로이드 어플리케이션(앱)에 Native code(C,C++등)을 이용한 임베딩 요소들을 사용할수 있는 툴셋입니다.

참고로 NDK는 Native Development Kit의 약자입니다.

안드로이드 어플리케이션(앱)은 Dalvik Virtual machine(VM)에서 돌아갑니다. NDK는 C나 C++같은 Native code를 어플리케이션에서 구현할수 있게 허락해줍니다.


NDK를 쓰는 이유

  1. Garbage Collection이 무서워서
  2. 메모리가 너무 많이 필요해서 (over 16M~24M of JVM)
  3. 다른 C/C++ 라이브러리를 사용하고 싶어서
  4. ㅂㅌ인증을 받고 싶어서...(농담입니다 @.@)

영상처리쪽이나 음성처리같이 메모리를 많이 필요하는 어플 구현에 NDK를 써야 최상의 결과를 낼수 있을겁니다.
ps. 그러나 용량이 엄청많이 늘어나겠지.. (먼산)
Buy me a coffeeBuy me a coffee

Nokia CEO Stephen Elop and Microsoft CEO Steve Ballmer announce partnership during press conference at Nokia Strategy and Financial Briefing on Friday February 11, 2011


Nokia사와 MS사간 장기 파트너쉽 체결. 

Nokia사와 MS사간 손잡는건 몇년전에는 상상도 못했던 일입니다. 

Nokia사 사장이 전 MS사 임원이라서 그런건가? 이제 모바일 천하삼분지계(Apple iPhone + Google Android + MS+Nokia Windows Phone)가 완성되는군요? 모바일 시장의 격동이 예상됩니다.


구글 부사장인 Victor Gundotra가 “Two Turkeys Do Not Make an Eagle”(두 마리의 칠면조로는 독수리를 만들 수 없다)라고 하였지만 (두 마리의 칠면조는 Nokia사와 M$사) 제 생각엔 아닐수도 있다고 생각합니다.

출처: Google’s Gundotra On Nokia/Microsoft Rumors: “Two Turkeys Do Not Make an Eagle”

Nokia사와 MS사가 한배를 탔습니다. 두 회사는 지금 Apple사와 Google사의 파상공세때문에 서로 도박을 하게 되었지요. 도박에서 성공할 것인지, 망해서 망할지는 지금 알수 없다만, 모바일 업계의 빅뱅은 이제 시작되었다고 볼 수 있을겁니다.

모바일 춘추전국시대 아니 모바일 천하삼분지계가 드디어 완성(?)되었습니다.


이제 슬슬 모바일 업계의 미래를 예측해보는 것도 흥미진진할듯 합니다.


ps. Symbian은 이제 죽었구나.

ps2. Intel과 Nokia와 합작해서 만들던 Meego는 이제 어쩔?

ps3.Nokia에서 밀고 있던 Opensource project인 QT와 KDE, Meego 등등의 미래가 암울해집니다.

ps4. Nokia사가 단순힌 모바일 하드웨어 제조 업체에서 Apple사처럼  제조업+서비스업체까지 점유하려고 했다만 실패하였습니다. MS사와 손잡고 MS사의 서비스를 이용한 MS사의 플랫폼을 받춰주는 하드웨어 제조 업체로 다시 회귀한 것 같습니다. 그동안의 Nokia의 전략이 거의 실패했다는 것이지요. Nokia사의 사용자로서 아쉽습니다.

Buy me a coffeeBuy me a coffee

이번에 Android에서 디코딩관련해서 C++코드를 사용해야할 일이 생겼다.

그래서 디코딩관련 C++코드와 Android 어플과 연계하는 방법을 찾다보니 JNI을 알아야겠다는 결론이 나왔음.

The Java Native Interface Programmer's Guide and Specification

간단한 Java Native Interface 예제

위의 링크에 나오는 Java Native Interface 관련 문서를 읽고 있다만 아직도 이해를 못하겠다.
너무 익숙하지 않아서 그런가?

Java 코드와 C++ 코드만 쳐다보니 어질어질..  

Buy me a coffeeBuy me a coffee

Google Nexus S vs. Galaxy S (Korean Version)


구글과 삼성이 합작하여 만든 Google Nexus S와 삼성 Galaxy S의 비교 동영상


스펙이 거의 같음에도 Google Nexus S가 좋게 보이는 이유는 소프트웨어 기업인 Google과 소프트웨어 최적화를 하여 하드웨어의 성능을 제대로 끌여들였기 때문이다.


결론: Google을 만난 삼성은 하드웨어와 소프트웨어 모두다 좋다.

Buy me a coffeeBuy me a coffee


구글 안드로이드 2.3 Gingerbread(생강빵)이 탑재된 Nexus S 소개 비디오가 나왔습니다.

2010년 1월달, Google과 HTC와 합작하여 Android 2.1 Eclair가 탑재된 Google Nexus One이 출시된 이래로 이번, 2010년 12월달엔 Google과 삼성전자가 합작하여 Android 2.3 Gingerbread가 Google Nexus S가 출시되는군요.

역시 삼성은 하드웨어 제조 기술이 최강인 OEM제조회사란 딱지가 붙을것으로 예상됩니다. (제발 소프트웨어 개발좀 잘하면 Galaxy S나 Galaxy tab을 구입할텐데 쩝 -ㅁ-)

마지막에 pure google이라는 문구에서 삼성이 Android 2.3 Gingerbread에 전혀 손 안대었고, 구글의 입김만 다가가서 삼성전자의 Galaxy S와는 상관 없다는 걸 표시하는 듯함.


Introducing Nexus S

Buy me a coffeeBuy me a coffee

현재, 전세계 사람들이 많이 사용하고 있는 Android 장치들의 하드웨어 버튼 배열과 아이콘들을 보면 각기 회사마다, 기종마다 위치와 모양이 다르게 설정되었다는 것을 알수 있습니다.

Android Button Comparison


안드로이드 휴대폰들의 하드웨어 버튼 배열은 출시한 회사마다, 기종마다 제각각이다. 똑같은 OS를 탑재한 폰인데 하드웨어 버튼 배열이 다른것일까? 그리고 아이콘도 제각각이라 보니 정신 없다. 각각의 휴대폰들이 똑같은 OS라는 것이 이상하게 느낄수 있음.

위와 같이 휴대폰의 버튼들이 각각 다르니 같은 안드로이드 OS 탑재폰이라도 어느 회사의 하드웨어 버튼 배열 및 아이콘 형태와 저 회사의 하드웨어 버튼 배열 및 아이콘 이 다르다 보니, 사용하는데 불편할수도?

Buy me a coffeeBuy me a coffee



현재, 저는 Android가 탑재된 HTC Desire으로 사용하고 있습니다.


5월초 HTC Desire를 구입하고 나서 계속 기본으로 탑재된 Sense UI를 사용하다, Sense UI를 쓰는 것보다 Froyo의 버전인 2.2.1을 빨리 맛보고 싶고, Google NexusOne의 UI를 사용하고 싶어 DeFroST custum rom으로 바꾼지 이제 1달 반정도 지나갑니다.


Sense UI를 사용할때보단 NesuxOne의 UI를 쓰다보니 뭔가 약간 부족하긴 하지만, Froyo를 제대로 쓰면서 속도로 빠른 것을 원했기 때문에, 계속 이 Rom으로 유지하고 싶군요.

DeFroST라는 단어에서 성에를 없애는 뜻같이 아주 매끄럽게 HTC Desire를 사용할수 있는 롬이라고 말할 수 있습니다.

 

2010년 11월 20일에 DeFroST 6.0g가 나와서 바로 설치하게 되었습니다.



DeFrost 6.0g를 설치후 휴대전화정보입니다.



다른 Desire롬보다 좋은 점은 최신 NexusOne에 들어간 OS인 Android 2.2.1이 들어간 점이 마음에 듭니다,


기존보다 DeFrost 6.0g의 변화된점입니다.

DeFroST의 기반인 넥서스원용 커스텀롬인 CyanogenMod의 변화와 Kernel 변화들을 적었습니다.

Version 6.0g:

CyanogenMod changes:

  • *WindowManagerService: Fix out of memory for surface error...
  • *Fix 2g/3g toggle on UMTS networks
  • *camera: Set default video focusmode to infinity
  • *Bionic: Aliasing problems with frexpf
  • *Browser: Browser settings are getting used before its initialization
  • *camera: Set video focus mode on startup
  • *Fix update of touch-focus and touch-aec
  • *Gallery3D: Add depth component to icon animation
  • *Add "Classic" mode to camera (mimics stock camera behavior regarding focus/shutter button)
  • *Fix sometimes mExpandedView will appear while screen transforming.
  • *Improve performance when getting styled string.
  • *Use a system property to determine mobile interfaces
  • *camera: Fix crash when attaching video to MMS.
  • *Change hide() to dismiss() to avoid memory leak.
  • *Add support for chunked encoding when downloading MMS PDUs
  • *Contacts: fix Contact icon cannot be replaced when set from gallery.
  • *Contacts: Check the parent for null in edit_delete
  • *Contacts: Handle the call event only for KeyUp event.

Kernel changes 6.0g:
  • *power: Enhanced ds2784 battery driver
  • *net: wireless: bcm4329: Use non-DFS channels only for US
  • *net: wireless: bcm4329: Improve way to detect BT SCO connection for BT-coex
  • *net: wireless: bcm4329: Update to Version 4.218.248-15
  • *sched: update "sched: automated per tty task groups" to 2010/11/18 - 2:00PM

Buy me a coffeeBuy me a coffee



구글 모바일 트위터(@GoogleMobile)에서 Android OS 2.3 Gingerbread를 조만간 공개할 것이라는 암시를 내보내는 사진을 올렸습니다.

출처: http://twitter.com/GoogleMobile/status/3174327650361344

출처 http://twitpic.com/3682u2


Google이 YouTube를 통해 Google 본사에 Gingerbread 동상을 세우는 동영상을 공개를 하였습니다.

이후, 이번엔 트위터를 통해서 Gingerbread 과자를 구운걸 트위터에 공개를 하였습니다.


Android OS 2.3 Gingerbread 가 언제 공개 될려나요? 기대됩니다^^


Buy me a coffeeBuy me a coffee

+ Recent posts