Sign in Join
Wiki copytemporary

Android Programming/ko: what changed

Revision 2 to 3. 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-```
17+```text
1818svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr lazarus-ccr
1919```
2020
2121또는 만약 너무 크다고 생각한다면 lazarus-ccr/bindings/android-ndk 폴더만 다운로드하면 된다.
2222
2323**4 단계** - 파스칼 라이브러리를 빌드한다.
2424
2525lazarus-ccr/bindings/android-ndk/examples/opengltest/opengltest.lpi 프로젝트를 연다.
2626
2727Project-\>Project Options-\>Paths로 가서 "Libraries -Fl"이라고 쓰인 곳에서 이 값을 확인한다:
2828
29-```
29+```text
3030/home/felipe/Programas/android-ndk-r5/platforms/android-9/arch-arm/usr/lib
3131```
3232
3333각자의 시스템에 있는 NDK와 최소 요구 안드로이드 API 레벨의 폴더를 가르키는 정확한 패스로 변경한다.
3434
3535이제 라자루스에서 프로젝트를 빌드한다.
3636
3737**5 단계** - 빌드환경을 구성한다.
3838
3939opengltest/local.propertie 파일을 열고 이 라인을 다음과 같이:
4040
41-```
41+```text
4242sdk.dir=/home/felipe/Programas/android-sdk-linux
4343```
4444
4545이것을 SDK 위치로 변경한다.
4646
4747**6 단계** - APK를 빌드한다.
4848
4949터미널을 역고 다음 명령을 입력한다:
5050
5151cd lazarus-ccr/bindings/ndk/examples/opengltest/android ant debug
5252
5353APK파일이 opengltest/android/bin/에 위치해 있을 것이다.
5454
5555**7 단계** - APK를 설치한다.
5656
5757이 단계에서 퍼미션에 관한 에러가 발생하면 다음 글을 읽어라: [[Android Interface/Using the Android SDK, Emulator and Phones|리눅스에서 장치의 인식]]
5858
5959폰에서 APK를 설치하는 명령은:
6060
61-```
61+```text
6262cd opengltest/android
6363~/Programas/android-sdk-linux/platform-tools/adb install bin/OpenGLNDKTest-debug.apk
64642395 KB/s (107299 bytes in 0.043s)
6565 pkg: /data/local/tmp/OpenGLNDKTest-debug.apk
6666Success
6767```
6868
6969이미 설치되어 있다는 에러 메세지가 나오면 다음 명령으로 설치할 수가 있다:
7070
71-```
71+```text
7272~/Programas/android-sdk-linux/platform-tools/adb uninstall com.pascal.opengltest
7373```
7474
7575그리고 나서 새로이 추가된 아이콘을 통해 폰에서 실행하는 동안 무슨 로그가 있는지 알려면 adb logcat을 실행하면 된다:
7676
77-```
77+```text
7878~/Programas/android-sdk-linux/platform-tools/adb logcat
7979```
8080
8181### 스크린 metrics 읽기
8282
8383먼저 TDisplayMetrics에 정확한 정보를 넣는다:
8484
8585``` pascal
8686uses androidutil;
8787
8888var
8989 MyDisplayMetrics: TDisplayMetrics;
9090 Str: string;
9191 //
9292 lHeight, lWidth: Integer;
9393 xdpi, ydpi, lScreenSize: Single;
9494begin
9595 // ..
9696 // 객체
9797
9898 MyDisplayMetrics := TDisplayMetrics.Create;
9999 Activity.getWindowManager().getDefaultDisplay().getMetrics(MyDisplayMetrics);
100100```
101101
102102그리고 나면 TDisplayMetrics에 읽을 수 있다:
103103
104104``` pascal
105105 lHeight := MyDisplayMetrics.heightPixels();
106106 lWidth := MyDisplayMetrics.widthPixels();
107107 xdpi := MyDisplayMetrics.xdpi();
108108 ydpi := MyDisplayMetrics.ydpi();
109109 lScreenSize := sqrt(sqr(lHeight / ydpi) + sqr(lWidth / xdpi));
110110 ldensity := MyDisplayMetrics.density();
111111 ldensityDpi := MyDisplayMetrics.densityDpi();
112112 scaledDensity := MyDisplayMetrics.scaledDensity();
113113```
114114
115115많은 장치가 xdpi 와 ydpi가 다르다. 그러므로 위에서 계산한 lScreenSize 를 믿지마라. 스마트폰이 10 인치로 되어 있더라도, 정확한 값은 4 주변이다.
116116
117117## 안드로이드 기기에 대한 세부사항
118118
119119무척 많은 안드로이드 기기가 있이 때문에, 기기에 대한 몇가지 정보를 추적하는 것이 유용할 수 있다. 안드로이드 기기에 대해 위키피디아에서 비교한 \[ <http://en.wikipedia.org/wiki/Comparison_of_Android_devices>\] 것과\[<https://wiki.mozilla.org/Mobile/Platforms/Android#System_Requirements%5D에> 있는 프로세서의 자세한 명세를 읽어봐야 한다.
120120
121121### 스마트폰
122122
123123| 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 |
124124|----|----|----|----|----|----|----|
125125| HTC | Wildfire | HTC Wildfire | armv6 | 2.1=\>2.2 | Yes\|\|- | |
126126| Sony Erricson | Xperia X10 | X10i | armv7 | 1.6=\>2.1 | No\|\|- | |
127127
128128### 태블릿
129129
130130| 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 |
131131|----|----|----|----|----|----|----|
132132| Toshiba | Folio 100 Tablet | TOSHIBA_FOLIO_AND_A | armv7 | 2.2 | Yes\|\|- | |
133133
134134### 프로세서 호환(ARMv6 vs ARMv7) 순서에 따른 기기 리스트
135135
136136**ARMv7 기기리스트:**
137137
138138- Advent Vega (P10AN01)
139139- Dell Streak, Streak 7
140140- HTC Desire
141141- HTC Desire Z (T-Mobile G2)
142142- HTC Desire HD
143143- HTC Droid Incredible
144144- HTC EVO 4G, EVO Shift 4G
145145- HTC Glacier (T-Mobile myTouch 4G)
146146- HTC Inspire 4G
147147- HTC Nexus One
148148- HTC Thunderbolt 4G
149149- Huawei Ideos S7
150150- LG Optimus Z
151151- Motorola Atrix 4G
152152- Motorola Bravo
153153- Motorola Cliq 2 - untested
154154- Motorola Defy
155155- Motorola Droid 2, Droid 2 Global
156156- Motorola Droid Pro (Motorola PRO)
157157- Motorola Droid X
158158- Motorola Xoom
159159- POV Mobii Tegra Tablet
160160- Samsung Continuum (i400)
161161- Samsung Galaxy S (i9000, Captivate, Fascinate, Vibrant, Epic 4G)
162162- Samsung Galaxy Tab
163163- Sharp IS03
164164- Sony Ericsson Xperia X10
165165- Toshiba AS100
166166- Viewsonic gTablet
167167- Acer Liquid E
168168- Acer Liquid (Liquid A1)
169169- Archos 101 Internet Tablet
170170- Motorola Charm
171171- Motorola Droid (Milestone)
172172- Samsung Galaxy S 4G
173173- Samsung Nexus S
174174
175175**ARMv6 프로세서 리스트:**
176176
177177- Android SDK 에뮬레이터
178178- Asus Garmin nuvifone A50 (T-Mobile Garminfone)
179179- Augen GENTouch 78 Tablet
180180- Coby Kyros Internet Tablet (MID7015)
181181- Geeksphone One, Geeksphone Zero
182182- HTC Aria
183183- HTC ChaCha
184184- HTC Dream (T-Mobile G1, Android Dev Phone 1)
185185- HTC Droid Eris
186186- HTC Espresso (T-Mobile myTouch 3G Slide)
187187- HTC Hero (T-Mobile G2 Touch)
188188- HTC Legend
189189- HTC Magic (T-Mobile myTouch 3G, T-Mobile G1 Touch)
190190- HTC Salsa
191191- HTC Tattoo
192192- HTC Wildfire
193193- Huawei Ascend
194194- Huawei Ideos U8150-B (T-Mobile Comet)
195195- Huawei U8110 (T-Mobile Pulse Mini)
196196- Huawei U8230
197197- LG Ally (Apex) (LG VS740)
198198- LG GW620 (Eve, InTouch Max, LinkMe)
199199- LG Optimus, Optimus M, Optimus T, Optimus S, Optimus V
200200- LG Vortex
201201- LG P500
202202- MAG iMiTO iM7
203203- vMAG iMiTO iM7S
204204- Motorola Backflip
205205- Motorola Citrus
206206- Motorola Cliq (MB200)
207207- Motorola Dext
208208- Motorola Devour
209209- Motorola i1
210210- Motorola Spice XT300
211211- Motorola Quench XT5 XT502
212212- Pandigital Novel
213213- Samsung GT-S5570 Galaxy Mini
214214- Samsung i5500 Galaxy 5 (Corby)
215215- Samsung i5700 Galaxy Portal (Spica)
216216- Samsung i5800 Galaxy 3
217217- Samsung i7500 Galaxy
218218- Samsung Intercept
219219- Samsung M900 Moment
220220- Samsung S5830 Galaxy Ace
221221- Samsung Transform
222222- Sanyo ZIO M6000
223223- Sony Ericsson Xperia X8
224224- Sony Ericsson Xperia X10 Mini
225225- Sony Ericsson Xperia X10 Mini Pro
226226- Superpad 10.2" Tablet PC
227227- Viewsonic ViewPad 7 Tablet
228228- Velocity Micro T103 Cruz tablet
229229- Vodafone 845
230230- ZTE Blade
231231
232232### 폰에서 사운드와 비디오 재생하기
233233
234234각각의 폰은 서로 다른 코덱이 설치되어 있어서 네이티브 미디어플레이어가 폰에 따라 다른 포멧으로 플레이 할 수가 있다는 것을 의미한다. 다음은 각 폰의 네이티브 미디어 플레이어가 어떤 포맷을 플레이하는지 모여주는 표이다:
235235
236236| 전화기 | 안드로이드 | webm - VP8 | m4v - H.264 | ogv - Theora | mp4 - H.264 | mov - H.264 | avi - RLE | mpg - MPEG-1 | wmv - WM9 | 3gp - MPEG-4 |
237237|----|----|----|----|----|----|----|----|----|----|----|
238238| 에뮬레이터 | 1.6 | x | x | x | x | x | x | x | x | OK |
239239| 에뮬레이터 | 2.1 | x | x | x | x | x | x | x | x | OK |
240240| Nexus One | 2.2 | x | OK | x | OK | x | x | x | x | OK |
241241| HTC Desire | 1.6 | x | OK | x | OK | x | x | x | OK | OK |
242242| Toshiba Folio 100 | 2.2 | x | OK | x | OK | x | x | x | OK | OK |
243243| Xperia X10 | 2.1 | x | OK | x | x | x | x | x | OK | OK |
244244| Xperia X8 | 2.2 | x | OK | x | x | x | x | x | x | OK |
245245| HTC Wildfire | 2.1 | x | OK | x | x | x | x | x | x | OK |
246246| HTC Desire HD | 2.2 | x | OK | x | OK | x | x | x | x | OK |
247247| Galaxy Tab | 2.2 | x | OK | x | x | x | x | x | x | OK |
248248| myPhone A210 | 1.6 | x | OK | x | x | x | x | x | x | OK |
249249| Motorola Milestone | 2.1 | x | OK | x | x | x | x | x | OK | ? |
250250| Milestone 2 | 2.2 | x | OK | x | x | x | x | x | 사운드만 | OK |
251251
252252## 안드로이드 파일 시스템
253253
254254안드로이드는 어플리케이션이 데이터 디렉토리를 얻을 때 getApplicationContext().getFilesDir()의 사용을 추천하며 이 루틴은 HTC Wildfire에서는 /data/data/\<패키지 명\> 을 반환한다.
255255
256256어플리케이션의 네이티브 라이브러리는 /data/data/\<패키지\>/lib 에 위치한다.
257257
258258읽고 쓰고 새로운 파일을 생성하고 파일을 실행 시키기 좋은 곳은 /data/data/\<패키지 명\> 이다.
259259
260260## 새로운 Java 어플리케이션의 생성
261261
262262이 정보는 LCL-CustomDrawn-Android의 구현을 도와주는데 유용할 수 있다.
263263
264264일반적인 설명은 이곳에 있다: <http://developer.android.com/guide/developing/other-ide.html>
265265
266266### 가상 키보드를 보이고 / 숨기기
267267
268268이곳을 보세요: <http://android-codes-examples.blogspot.com/2011/11/show-or-hide-soft-keyboard-on-opening.html>
269269
270270나타내기:
271271
272272``` pascal
273273InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
274274imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
275275```
276276
277277키보드 감추기 위해서는:
278278
279279``` pascal
280280InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
281281imm.hideSoftInputFromWindow(singleedittext.getWindowToken(),0);
282282```
283283
284284## 안드로이드 JNI
285285
286286JNI (Java Native Interface)를 사용하여 대부분의 안드로이드 SDK API들과 다른 Java 라이브러리를 호출 할 수 있다.
287287
288288### Java 타입과 파스칼 JNI 타입에 대한 표
289289
290290인터페이스를 제외한 모든 Java 타입들은 JNI에서 문제없이 표시할 수 있다. 각각의 Java 타입에 대해 javaEnvRef^^.GetMethodID 과 같이 루틴에서 사용되는 VM 타입에 대응하는 것이 존재한다. 또한 JNI 네이티브 타입이 있으며, 이는 lazarus/lcl/interfaces/customdrawn/android/jni.pas 유닛에 선언되어 있고 파스칼로 작성된 JNI 코드에서 이용되는 타입이어야 한다. 파스칼에서 동등한 타입이 비교를 위해 제공 되며, JNI 코드를 작성할 때는 jni.pas 에서 선언된 타입이어야 한다.
291291
292292| Java Types | VM 시그너쳐 | jni.pas에서의 Types | 파스칼에서 | 설명 |
293293|----|----|----|----|----|
294294| boolean | Z | jboolean | Boolean | |
295295| byte | B | jbyte | Byte | |
296296| char | C | jchar | Word | |
297297| short | S | jshort | Shortint | |
298298| int | I | jint | Integer | |
299299| long | J | jlong | Int64 | |
300300| float | F | jfloat | Single | |
301301| double | D | jdouble | Double | |
302302| a class, ie: String or InputStream | L\<full class name\> ie: Ljava/lang/String; | jobject | N/A | |
303303| Array, ie: int\[\] | \[\<type-name\> ie: \[I | N/A | | |
304304| A method type | (arg-types)ref-type | JMethodID | N/A | |
305305| void | V | N/A | procedure | |
306306
307307### 예제 1: Java 오브젝트를 생성하고 Java 메서드를 호출하기
308308
309309다음 Java 코드에 대응하는 파스칼 JNI 코드를 원한다고 하자.
310310
311311``` java
312312 HttpGet javaRequest = new HttpGet();
313313 URI myURI = new URI("http://magnifier.sourceforge.net/");
314314 javaRequest.setURI(myURI);
315315```
316316
317317먼저 프로세스에 포함되는 모든 Class ID를 얻어야 한다. 그리고 나서 사용할 모든 메서드의 ID를 얻고 호출을 한다. 만약 호출이 파라메터를 가진다면, 배열로 전달한다. 다음 파스칼 네이티브 코드는 위의 Java 코드에 대응한다:
318318
319319``` pascal
320320uses jni, customdrawnint;
321321
322322var
323323 javaClass_HttpGet, javaClass_URI: jclass;
324324 javaMethod_HttpGet_new, javaMethod_HttpGet_setURI,
325325 javaMethod_URI_new: jmethodid;
326326 javaRequest, javaURI: jobject;
327327 javaString: jstring;
328328 lParams: array[0..2] of JValue;
329329 lNativeString: PChar;
330330begin
331331 DebugLn(':>LoadHTMLPageViaJNI');
332332 // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다.
333333 javaClass_HttpGet := javaEnvRef^^.FindClass(javaEnvRef,
334334 'org/apache/http/client/methods/HttpGet');
335335 javaClass_URI := javaEnvRef^^.FindClass(javaEnvRef,
336336 'java/net/URI');
337337
338338 // 이제 모든 메서드 ID를 얻는다
339339 DebugLn(':LoadHTMLPageViaJNI 1');
340340 javaMethod_HttpGet_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, '<init>', '()V');
341341 javaMethod_HttpGet_setURI := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, 'setURI', '(Ljava/net/URI;)V');
342342 javaMethod_URI_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_URI, '<init>', '(Ljava/lang/String;)V');
343343
344344 // HTTP 응답 객체에 대한 새로운 인스턴스를 생성한다
345345 // HttpGet javaRequest = new HttpGet();
346346 javaRequest := javaEnvRef^^.NewObject(javaEnvRef,
347347 javaClass_HttpGet,
348348 javaMethod_HttpGet_new);
349349
350350 DebugLn(':LoadHTMLPageViaJNI 4 javaRequest='+IntToHex(PtrInt(javaRequest), 8));
351351 // 응답 객체에 URI를 추가한다
352352 // URI javaURI = new URI("http://magnifier.sourceforge.net/");
353353 lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, 'http://magnifier.sourceforge.net');
354354 javaURI := javaEnvRef^^.NewObjectA(javaEnvRef,
355355 javaClass_URI, javaMethod_URI_new, @lParams[0]);
356356 javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l);
357357 // javaRequest.setURI(javaURI);
358358 lParams[0].l := javaURI;
359359 javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaRequest,
360360 javaMethod_HttpGet_setURI, @lParams[0]);
361361```
362362
363363### 예제 2: 정적 메서드 호출
364364
365365Bass 클래스에 있는 다음 정적 메서드를 호출하기를 원한다고 하자. <http://jerome.jouvie.free.fr/nativebass/javadoc/org/jouvieje/bass/Bass.html>
366366
367367``` java
368368 public static native int BASS_StreamCreateFile(String file, long offset, long length, int flags);
369369```
370370
371371먼저 프로세스에 포함된 모든 Class ID를 얻고 정적 메서드의 ID를 얻으며 배열과 함께 파라메터를 넣어 호출한다:
372372
373373``` pascal
374374uses jni, customdrawnint;
375375
376376var
377377 javaClass_Bass: jclass;
378378 javaMethod_Bass_BASS_StreamCreateFile: jmethodid;
379379 javaString: jstring;
380380 lParams: array[0..3] of JValue;
381381 lRetInt: jint;
382382begin
383383 // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다.
384384 javaClass_Bass := javaEnvRef^^.FindClass(javaEnvRef, 'org/jouvieje/bass/Bass');
385385
386386 // 모든 메서드 ID
387387 javaMethod_Bass_BASS_StreamCreateFile := javaEnvRef^^.GetStaticMethodID(javaEnvRef, javaClass_Bass, 'BASS_StreamCreateFile', '(Ljava/lang/String;JJI)I');
388388
389389 // 호출한다.
390390 lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, '/path/to/file');
391391 lParams[1].j := 0; // 오프셋
392392 lParams[2].j := 200; // 길이
393393 lParams[3].i := 0; // 플래그
394394 lRetInt := javaEnvRef^^.CallStaticIntMethodA(javaEnvRef, javaClass_Bass, javaMethod_Bass_BASS_StreamCreateFile, @lParams[0]);
395395 javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l);
396396```
397397
398398## 참고
399399
400400- <http://developer.android.com/guide/developing/other-ide.html>
401401
402402---
403403*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).*
404404Category: Android/ko

Back to history