Sign in Join
Wiki copytemporary

Android Programming/ko: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11[[Custom Drawn Interface/Android|Custom Drawn Interface/Android도]] 보세요
22
33일반적인 안드로이드 프로그래밍을 아는 것은 라자루스 안드로이드 인터페이스를 개발에 매우 유용하다.
44
55## 방법...
66
77### NDK OpenGL 예제 빌드하기
88
99다음 단계를 따르시요:
1010
1111**1 단계** - 안드로이드 NDK, 안드로이드 SDK 및 Ant.를 다운로드하고 설치하세요. 더 많은 정보는 다음에: [[Android Interface/Using the Android SDK, Emulator and Phones|안드로이드 SDK와 에뮬레이터 및 폰을 사용한 안드로이드 인터페이스]]
1212
1313**2 단계** - 프리-컴파일 된 FPC 크로스-컴파일러를 설치한다. 설명은 이곳에: [[Android Interface|Android_Interface#Using_the_pre-compiled_compiler]]
1414
1515**3 단계** - 최신 라자루스 ccr소스포지 코드를 다운로드 한다:
1616
17-`svn co `[`https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr`](https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr)` lazarus-ccr`
17+```
18+svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr lazarus-ccr
19+```
1820
1921또는 만약 너무 크다고 생각한다면 lazarus-ccr/bindings/android-ndk 폴더만 다운로드하면 된다.
2022
2123**4 단계** - 파스칼 라이브러리를 빌드한다.
2224
2325lazarus-ccr/bindings/android-ndk/examples/opengltest/opengltest.lpi 프로젝트를 연다.
2426
2527Project-\>Project Options-\>Paths로 가서 "Libraries -Fl"이라고 쓰인 곳에서 이 값을 확인한다:
2628
27-`/home/felipe/Programas/android-ndk-r5/platforms/android-9/arch-arm/usr/lib`
29+```
30+/home/felipe/Programas/android-ndk-r5/platforms/android-9/arch-arm/usr/lib
31+```
2832
2933각자의 시스템에 있는 NDK와 최소 요구 안드로이드 API 레벨의 폴더를 가르키는 정확한 패스로 변경한다.
3034
3135이제 라자루스에서 프로젝트를 빌드한다.
3236
3337**5 단계** - 빌드환경을 구성한다.
3438
3539opengltest/local.propertie 파일을 열고 이 라인을 다음과 같이:
3640
37-`sdk.dir=/home/felipe/Programas/android-sdk-linux`
41+```
42+sdk.dir=/home/felipe/Programas/android-sdk-linux
43+```
3844
3945이것을 SDK 위치로 변경한다.
4046
4147**6 단계** - APK를 빌드한다.
4248
4349터미널을 역고 다음 명령을 입력한다:
4450
4551cd lazarus-ccr/bindings/ndk/examples/opengltest/android ant debug
4652
4753APK파일이 opengltest/android/bin/에 위치해 있을 것이다.
4854
4955**7 단계** - APK를 설치한다.
5056
5157이 단계에서 퍼미션에 관한 에러가 발생하면 다음 글을 읽어라: [[Android Interface/Using the Android SDK, Emulator and Phones|리눅스에서 장치의 인식]]
5258
5359폰에서 APK를 설치하는 명령은:
5460
55-`cd opengltest/android`\
56-`~/Programas/android-sdk-linux/platform-tools/adb install bin/OpenGLNDKTest-debug.apk `\
57-`2395 KB/s (107299 bytes in 0.043s)`\
58-`       pkg: /data/local/tmp/OpenGLNDKTest-debug.apk`\
59-`Success`
61+```
62+cd opengltest/android
63+~/Programas/android-sdk-linux/platform-tools/adb install bin/OpenGLNDKTest-debug.apk
64+2395 KB/s (107299 bytes in 0.043s)
65+ pkg: /data/local/tmp/OpenGLNDKTest-debug.apk
66+Success
67+```
6068
6169이미 설치되어 있다는 에러 메세지가 나오면 다음 명령으로 설치할 수가 있다:
6270
63-`~/Programas/android-sdk-linux/platform-tools/adb uninstall com.pascal.opengltest`
71+```
72+~/Programas/android-sdk-linux/platform-tools/adb uninstall com.pascal.opengltest
73+```
6474
6575그리고 나서 새로이 추가된 아이콘을 통해 폰에서 실행하는 동안 무슨 로그가 있는지 알려면 adb logcat을 실행하면 된다:
6676
67-`~/Programas/android-sdk-linux/platform-tools/adb logcat`
77+```
78+~/Programas/android-sdk-linux/platform-tools/adb logcat
79+```
6880
6981### 스크린 metrics 읽기
7082
7183먼저 TDisplayMetrics에 정확한 정보를 넣는다:
7284
7385``` pascal
7486uses androidutil;
7587
7688var
7789 MyDisplayMetrics: TDisplayMetrics;
7890 Str: string;
7991 //
8092 lHeight, lWidth: Integer;
8193 xdpi, ydpi, lScreenSize: Single;
8294begin
8395 // ..
8496 // 객체
8597
8698 MyDisplayMetrics := TDisplayMetrics.Create;
8799 Activity.getWindowManager().getDefaultDisplay().getMetrics(MyDisplayMetrics);
88100```
89101
90102그리고 나면 TDisplayMetrics에 읽을 수 있다:
91103
92104``` pascal
93105 lHeight := MyDisplayMetrics.heightPixels();
94106 lWidth := MyDisplayMetrics.widthPixels();
95107 xdpi := MyDisplayMetrics.xdpi();
96108 ydpi := MyDisplayMetrics.ydpi();
97109 lScreenSize := sqrt(sqr(lHeight / ydpi) + sqr(lWidth / xdpi));
98110 ldensity := MyDisplayMetrics.density();
99111 ldensityDpi := MyDisplayMetrics.densityDpi();
100112 scaledDensity := MyDisplayMetrics.scaledDensity();
101113```
102114
103115많은 장치가 xdpi 와 ydpi가 다르다. 그러므로 위에서 계산한 lScreenSize 를 믿지마라. 스마트폰이 10 인치로 되어 있더라도, 정확한 값은 4 주변이다.
104116
105117## 안드로이드 기기에 대한 세부사항
106118
107119무척 많은 안드로이드 기기가 있이 때문에, 기기에 대한 몇가지 정보를 추적하는 것이 유용할 수 있다. 안드로이드 기기에 대해 위키피디아에서 비교한 \[ <http://en.wikipedia.org/wiki/Comparison_of_Android_devices>\] 것과\[<https://wiki.mozilla.org/Mobile/Platforms/Android#System_Requirements%5D에> 있는 프로세서의 자세한 명세를 읽어봐야 한다.
108120
109121### 스마트폰
110122
111123| 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 |
112124|----|----|----|----|----|----|----|
113125| HTC | Wildfire | HTC Wildfire | armv6 | 2.1=\>2.2 | Yes\|\|- | |
114126| Sony Erricson | Xperia X10 | X10i | armv7 | 1.6=\>2.1 | No\|\|- | |
115127
116128### 태블릿
117129
118130| 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 |
119131|----|----|----|----|----|----|----|
120132| Toshiba | Folio 100 Tablet | TOSHIBA_FOLIO_AND_A | armv7 | 2.2 | Yes\|\|- | |
121133
122134### 프로세서 호환(ARMv6 vs ARMv7) 순서에 따른 기기 리스트
123135
124136**ARMv7 기기리스트:**
125137
126138- Advent Vega (P10AN01)
127139- Dell Streak, Streak 7
128140- HTC Desire
129141- HTC Desire Z (T-Mobile G2)
130142- HTC Desire HD
131143- HTC Droid Incredible
132144- HTC EVO 4G, EVO Shift 4G
133145- HTC Glacier (T-Mobile myTouch 4G)
134146- HTC Inspire 4G
135147- HTC Nexus One
136148- HTC Thunderbolt 4G
137149- Huawei Ideos S7
138150- LG Optimus Z
139151- Motorola Atrix 4G
140152- Motorola Bravo
141153- Motorola Cliq 2 - untested
142154- Motorola Defy
143155- Motorola Droid 2, Droid 2 Global
144156- Motorola Droid Pro (Motorola PRO)
145157- Motorola Droid X
146158- Motorola Xoom
147159- POV Mobii Tegra Tablet
148160- Samsung Continuum (i400)
149161- Samsung Galaxy S (i9000, Captivate, Fascinate, Vibrant, Epic 4G)
150162- Samsung Galaxy Tab
151163- Sharp IS03
152164- Sony Ericsson Xperia X10
153165- Toshiba AS100
154166- Viewsonic gTablet
155167- Acer Liquid E
156168- Acer Liquid (Liquid A1)
157169- Archos 101 Internet Tablet
158170- Motorola Charm
159171- Motorola Droid (Milestone)
160172- Samsung Galaxy S 4G
161173- Samsung Nexus S
162174
163175**ARMv6 프로세서 리스트:**
164176
165177- Android SDK 에뮬레이터
166178- Asus Garmin nuvifone A50 (T-Mobile Garminfone)
167179- Augen GENTouch 78 Tablet
168180- Coby Kyros Internet Tablet (MID7015)
169181- Geeksphone One, Geeksphone Zero
170182- HTC Aria
171183- HTC ChaCha
172184- HTC Dream (T-Mobile G1, Android Dev Phone 1)
173185- HTC Droid Eris
174186- HTC Espresso (T-Mobile myTouch 3G Slide)
175187- HTC Hero (T-Mobile G2 Touch)
176188- HTC Legend
177189- HTC Magic (T-Mobile myTouch 3G, T-Mobile G1 Touch)
178190- HTC Salsa
179191- HTC Tattoo
180192- HTC Wildfire
181193- Huawei Ascend
182194- Huawei Ideos U8150-B (T-Mobile Comet)
183195- Huawei U8110 (T-Mobile Pulse Mini)
184196- Huawei U8230
185197- LG Ally (Apex) (LG VS740)
186198- LG GW620 (Eve, InTouch Max, LinkMe)
187199- LG Optimus, Optimus M, Optimus T, Optimus S, Optimus V
188200- LG Vortex
189201- LG P500
190202- MAG iMiTO iM7
191203- vMAG iMiTO iM7S
192204- Motorola Backflip
193205- Motorola Citrus
194206- Motorola Cliq (MB200)
195207- Motorola Dext
196208- Motorola Devour
197209- Motorola i1
198210- Motorola Spice XT300
199211- Motorola Quench XT5 XT502
200212- Pandigital Novel
201213- Samsung GT-S5570 Galaxy Mini
202214- Samsung i5500 Galaxy 5 (Corby)
203215- Samsung i5700 Galaxy Portal (Spica)
204216- Samsung i5800 Galaxy 3
205217- Samsung i7500 Galaxy
206218- Samsung Intercept
207219- Samsung M900 Moment
208220- Samsung S5830 Galaxy Ace
209221- Samsung Transform
210222- Sanyo ZIO M6000
211223- Sony Ericsson Xperia X8
212224- Sony Ericsson Xperia X10 Mini
213225- Sony Ericsson Xperia X10 Mini Pro
214226- Superpad 10.2" Tablet PC
215227- Viewsonic ViewPad 7 Tablet
216228- Velocity Micro T103 Cruz tablet
217229- Vodafone 845
218230- ZTE Blade
219231
220232### 폰에서 사운드와 비디오 재생하기
221233
222234각각의 폰은 서로 다른 코덱이 설치되어 있어서 네이티브 미디어플레이어가 폰에 따라 다른 포멧으로 플레이 할 수가 있다는 것을 의미한다. 다음은 각 폰의 네이티브 미디어 플레이어가 어떤 포맷을 플레이하는지 모여주는 표이다:
223235
224236| 전화기 | 안드로이드 | webm - VP8 | m4v - H.264 | ogv - Theora | mp4 - H.264 | mov - H.264 | avi - RLE | mpg - MPEG-1 | wmv - WM9 | 3gp - MPEG-4 |
225237|----|----|----|----|----|----|----|----|----|----|----|
226238| 에뮬레이터 | 1.6 | x | x | x | x | x | x | x | x | OK |
227239| 에뮬레이터 | 2.1 | x | x | x | x | x | x | x | x | OK |
228240| Nexus One | 2.2 | x | OK | x | OK | x | x | x | x | OK |
229241| HTC Desire | 1.6 | x | OK | x | OK | x | x | x | OK | OK |
230242| Toshiba Folio 100 | 2.2 | x | OK | x | OK | x | x | x | OK | OK |
231243| Xperia X10 | 2.1 | x | OK | x | x | x | x | x | OK | OK |
232244| Xperia X8 | 2.2 | x | OK | x | x | x | x | x | x | OK |
233245| HTC Wildfire | 2.1 | x | OK | x | x | x | x | x | x | OK |
234246| HTC Desire HD | 2.2 | x | OK | x | OK | x | x | x | x | OK |
235247| Galaxy Tab | 2.2 | x | OK | x | x | x | x | x | x | OK |
236248| myPhone A210 | 1.6 | x | OK | x | x | x | x | x | x | OK |
237249| Motorola Milestone | 2.1 | x | OK | x | x | x | x | x | OK | ? |
238250| Milestone 2 | 2.2 | x | OK | x | x | x | x | x | 사운드만 | OK |
239251
240252## 안드로이드 파일 시스템
241253
242254안드로이드는 어플리케이션이 데이터 디렉토리를 얻을 때 getApplicationContext().getFilesDir()의 사용을 추천하며 이 루틴은 HTC Wildfire에서는 /data/data/\<패키지 명\> 을 반환한다.
243255
244256어플리케이션의 네이티브 라이브러리는 /data/data/\<패키지\>/lib 에 위치한다.
245257
246258읽고 쓰고 새로운 파일을 생성하고 파일을 실행 시키기 좋은 곳은 /data/data/\<패키지 명\> 이다.
247259
248260## 새로운 Java 어플리케이션의 생성
249261
250262이 정보는 LCL-CustomDrawn-Android의 구현을 도와주는데 유용할 수 있다.
251263
252264일반적인 설명은 이곳에 있다: <http://developer.android.com/guide/developing/other-ide.html>
253265
254266### 가상 키보드를 보이고 / 숨기기
255267
256268이곳을 보세요: <http://android-codes-examples.blogspot.com/2011/11/show-or-hide-soft-keyboard-on-opening.html>
257269
258270나타내기:
259271
260272``` pascal
261273InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
262274imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
263275```
264276
265277키보드 감추기 위해서는:
266278
267279``` pascal
268280InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
269281imm.hideSoftInputFromWindow(singleedittext.getWindowToken(),0);
270282```
271283
272284## 안드로이드 JNI
273285
274286JNI (Java Native Interface)를 사용하여 대부분의 안드로이드 SDK API들과 다른 Java 라이브러리를 호출 할 수 있다.
275287
276288### Java 타입과 파스칼 JNI 타입에 대한 표
277289
278290인터페이스를 제외한 모든 Java 타입들은 JNI에서 문제없이 표시할 수 있다. 각각의 Java 타입에 대해 javaEnvRef^^.GetMethodID 과 같이 루틴에서 사용되는 VM 타입에 대응하는 것이 존재한다. 또한 JNI 네이티브 타입이 있으며, 이는 lazarus/lcl/interfaces/customdrawn/android/jni.pas 유닛에 선언되어 있고 파스칼로 작성된 JNI 코드에서 이용되는 타입이어야 한다. 파스칼에서 동등한 타입이 비교를 위해 제공 되며, JNI 코드를 작성할 때는 jni.pas 에서 선언된 타입이어야 한다.
279291
280292| Java Types | VM 시그너쳐 | jni.pas에서의 Types | 파스칼에서 | 설명 |
281293|----|----|----|----|----|
282294| boolean | Z | jboolean | Boolean | |
283295| byte | B | jbyte | Byte | |
284296| char | C | jchar | Word | |
285297| short | S | jshort | Shortint | |
286298| int | I | jint | Integer | |
287299| long | J | jlong | Int64 | |
288300| float | F | jfloat | Single | |
289301| double | D | jdouble | Double | |
290302| a class, ie: String or InputStream | L\<full class name\> ie: Ljava/lang/String; | jobject | N/A | |
291303| Array, ie: int\[\] | \[\<type-name\> ie: \[I | N/A | | |
292304| A method type | (arg-types)ref-type | JMethodID | N/A | |
293305| void | V | N/A | procedure | |
294306
295307### 예제 1: Java 오브젝트를 생성하고 Java 메서드를 호출하기
296308
297309다음 Java 코드에 대응하는 파스칼 JNI 코드를 원한다고 하자.
298310
299311``` java
300312 HttpGet javaRequest = new HttpGet();
301313 URI myURI = new URI("http://magnifier.sourceforge.net/");
302314 javaRequest.setURI(myURI);
303315```
304316
305317먼저 프로세스에 포함되는 모든 Class ID를 얻어야 한다. 그리고 나서 사용할 모든 메서드의 ID를 얻고 호출을 한다. 만약 호출이 파라메터를 가진다면, 배열로 전달한다. 다음 파스칼 네이티브 코드는 위의 Java 코드에 대응한다:
306318
307319``` pascal
308320uses jni, customdrawnint;
309321
310322var
311323 javaClass_HttpGet, javaClass_URI: jclass;
312324 javaMethod_HttpGet_new, javaMethod_HttpGet_setURI,
313325 javaMethod_URI_new: jmethodid;
314326 javaRequest, javaURI: jobject;
315327 javaString: jstring;
316328 lParams: array[0..2] of JValue;
317329 lNativeString: PChar;
318330begin
319331 DebugLn(':>LoadHTMLPageViaJNI');
320332 // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다.
321333 javaClass_HttpGet := javaEnvRef^^.FindClass(javaEnvRef,
322334 'org/apache/http/client/methods/HttpGet');
323335 javaClass_URI := javaEnvRef^^.FindClass(javaEnvRef,
324336 'java/net/URI');
325337
326338 // 이제 모든 메서드 ID를 얻는다
327339 DebugLn(':LoadHTMLPageViaJNI 1');
328340 javaMethod_HttpGet_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, '<init>', '()V');
329341 javaMethod_HttpGet_setURI := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, 'setURI', '(Ljava/net/URI;)V');
330342 javaMethod_URI_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_URI, '<init>', '(Ljava/lang/String;)V');
331343
332344 // HTTP 응답 객체에 대한 새로운 인스턴스를 생성한다
333345 // HttpGet javaRequest = new HttpGet();
334346 javaRequest := javaEnvRef^^.NewObject(javaEnvRef,
335347 javaClass_HttpGet,
336348 javaMethod_HttpGet_new);
337349
338350 DebugLn(':LoadHTMLPageViaJNI 4 javaRequest='+IntToHex(PtrInt(javaRequest), 8));
339351 // 응답 객체에 URI를 추가한다
340352 // URI javaURI = new URI("http://magnifier.sourceforge.net/");
341353 lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, 'http://magnifier.sourceforge.net');
342354 javaURI := javaEnvRef^^.NewObjectA(javaEnvRef,
343355 javaClass_URI, javaMethod_URI_new, @lParams[0]);
344356 javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l);
345357 // javaRequest.setURI(javaURI);
346358 lParams[0].l := javaURI;
347359 javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaRequest,
348360 javaMethod_HttpGet_setURI, @lParams[0]);
349361```
350362
351363### 예제 2: 정적 메서드 호출
352364
353365Bass 클래스에 있는 다음 정적 메서드를 호출하기를 원한다고 하자. <http://jerome.jouvie.free.fr/nativebass/javadoc/org/jouvieje/bass/Bass.html>
354366
355367``` java
356368 public static native int BASS_StreamCreateFile(String file, long offset, long length, int flags);
357369```
358370
359371먼저 프로세스에 포함된 모든 Class ID를 얻고 정적 메서드의 ID를 얻으며 배열과 함께 파라메터를 넣어 호출한다:
360372
361373``` pascal
362374uses jni, customdrawnint;
363375
364376var
365377 javaClass_Bass: jclass;
366378 javaMethod_Bass_BASS_StreamCreateFile: jmethodid;
367379 javaString: jstring;
368380 lParams: array[0..3] of JValue;
369381 lRetInt: jint;
370382begin
371383 // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다.
372384 javaClass_Bass := javaEnvRef^^.FindClass(javaEnvRef, 'org/jouvieje/bass/Bass');
373385
374386 // 모든 메서드 ID
375387 javaMethod_Bass_BASS_StreamCreateFile := javaEnvRef^^.GetStaticMethodID(javaEnvRef, javaClass_Bass, 'BASS_StreamCreateFile', '(Ljava/lang/String;JJI)I');
376388
377389 // 호출한다.
378390 lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, '/path/to/file');
379391 lParams[1].j := 0; // 오프셋
380392 lParams[2].j := 200; // 길이
381393 lParams[3].i := 0; // 플래그
382394 lRetInt := javaEnvRef^^.CallStaticIntMethodA(javaEnvRef, javaClass_Bass, javaMethod_Bass_BASS_StreamCreateFile, @lParams[0]);
383395 javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l);
384396```
385397
386398## 참고
387399
388400- <http://developer.android.com/guide/developing/other-ide.html>
389401
390402---
391403*From the Free Pascal wiki, page "Android Programming/ko", as it stood on 2020-02-09 after a change by GAN, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
392404Category: Android/ko

Back to history