Android Programming/ko: what changed
Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | [[Custom Drawn Interface/Android|Custom Drawn Interface/Android도]] 보세요 | |
| 2 | 2 | ||
| 3 | 3 | 일반적인 안드로이드 프로그래밍을 아는 것은 라자루스 안드로이드 인터페이스를 개발에 매우 유용하다. | |
| 4 | 4 | ||
| 5 | 5 | ## 방법... | |
| 6 | 6 | ||
| 7 | 7 | ### NDK OpenGL 예제 빌드하기 | |
| 8 | 8 | ||
| 9 | 9 | 다음 단계를 따르시요: | |
| 10 | 10 | ||
| 11 | 11 | **1 단계** - 안드로이드 NDK, 안드로이드 SDK 및 Ant.를 다운로드하고 설치하세요. 더 많은 정보는 다음에: [[Android Interface/Using the Android SDK, Emulator and Phones|안드로이드 SDK와 에뮬레이터 및 폰을 사용한 안드로이드 인터페이스]] | |
| 12 | 12 | ||
| 13 | 13 | **2 단계** - 프리-컴파일 된 FPC 크로스-컴파일러를 설치한다. 설명은 이곳에: [[Android Interface|Android_Interface#Using_the_pre-compiled_compiler]] | |
| 14 | 14 | ||
| 15 | 15 | **3 단계** - 최신 라자루스 ccr소스포지 코드를 다운로드 한다: | |
| 16 | 16 | ||
| 17 | - | ||
| 17 | + | ```text | |
| 18 | 18 | svn co https://lazarus-ccr.svn.sourceforge.net/svnroot/lazarus-ccr lazarus-ccr | |
| 19 | 19 | ``` | |
| 20 | 20 | ||
| 21 | 21 | 또는 만약 너무 크다고 생각한다면 lazarus-ccr/bindings/android-ndk 폴더만 다운로드하면 된다. | |
| 22 | 22 | ||
| 23 | 23 | **4 단계** - 파스칼 라이브러리를 빌드한다. | |
| 24 | 24 | ||
| 25 | 25 | lazarus-ccr/bindings/android-ndk/examples/opengltest/opengltest.lpi 프로젝트를 연다. | |
| 26 | 26 | ||
| 27 | 27 | Project-\>Project Options-\>Paths로 가서 "Libraries -Fl"이라고 쓰인 곳에서 이 값을 확인한다: | |
| 28 | 28 | ||
| 29 | - | ||
| 29 | + | ```text | |
| 30 | 30 | /home/felipe/Programas/android-ndk-r5/platforms/android-9/arch-arm/usr/lib | |
| 31 | 31 | ``` | |
| 32 | 32 | ||
| 33 | 33 | 각자의 시스템에 있는 NDK와 최소 요구 안드로이드 API 레벨의 폴더를 가르키는 정확한 패스로 변경한다. | |
| 34 | 34 | ||
| 35 | 35 | 이제 라자루스에서 프로젝트를 빌드한다. | |
| 36 | 36 | ||
| 37 | 37 | **5 단계** - 빌드환경을 구성한다. | |
| 38 | 38 | ||
| 39 | 39 | opengltest/local.propertie 파일을 열고 이 라인을 다음과 같이: | |
| 40 | 40 | ||
| 41 | - | ||
| 41 | + | ```text | |
| 42 | 42 | sdk.dir=/home/felipe/Programas/android-sdk-linux | |
| 43 | 43 | ``` | |
| 44 | 44 | ||
| 45 | 45 | 이것을 SDK 위치로 변경한다. | |
| 46 | 46 | ||
| 47 | 47 | **6 단계** - APK를 빌드한다. | |
| 48 | 48 | ||
| 49 | 49 | 터미널을 역고 다음 명령을 입력한다: | |
| 50 | 50 | ||
| 51 | 51 | cd lazarus-ccr/bindings/ndk/examples/opengltest/android ant debug | |
| 52 | 52 | ||
| 53 | 53 | APK파일이 opengltest/android/bin/에 위치해 있을 것이다. | |
| 54 | 54 | ||
| 55 | 55 | **7 단계** - APK를 설치한다. | |
| 56 | 56 | ||
| 57 | 57 | 이 단계에서 퍼미션에 관한 에러가 발생하면 다음 글을 읽어라: [[Android Interface/Using the Android SDK, Emulator and Phones|리눅스에서 장치의 인식]] | |
| 58 | 58 | ||
| 59 | 59 | 폰에서 APK를 설치하는 명령은: | |
| 60 | 60 | ||
| 61 | - | ||
| 61 | + | ```text | |
| 62 | 62 | cd opengltest/android | |
| 63 | 63 | ~/Programas/android-sdk-linux/platform-tools/adb install bin/OpenGLNDKTest-debug.apk | |
| 64 | 64 | 2395 KB/s (107299 bytes in 0.043s) | |
| 65 | 65 | pkg: /data/local/tmp/OpenGLNDKTest-debug.apk | |
| 66 | 66 | Success | |
| 67 | 67 | ``` | |
| 68 | 68 | ||
| 69 | 69 | 이미 설치되어 있다는 에러 메세지가 나오면 다음 명령으로 설치할 수가 있다: | |
| 70 | 70 | ||
| 71 | - | ||
| 71 | + | ```text | |
| 72 | 72 | ~/Programas/android-sdk-linux/platform-tools/adb uninstall com.pascal.opengltest | |
| 73 | 73 | ``` | |
| 74 | 74 | ||
| 75 | 75 | 그리고 나서 새로이 추가된 아이콘을 통해 폰에서 실행하는 동안 무슨 로그가 있는지 알려면 adb logcat을 실행하면 된다: | |
| 76 | 76 | ||
| 77 | - | ||
| 77 | + | ```text | |
| 78 | 78 | ~/Programas/android-sdk-linux/platform-tools/adb logcat | |
| 79 | 79 | ``` | |
| 80 | 80 | ||
| 81 | 81 | ### 스크린 metrics 읽기 | |
| 82 | 82 | ||
| 83 | 83 | 먼저 TDisplayMetrics에 정확한 정보를 넣는다: | |
| 84 | 84 | ||
| 85 | 85 | ``` pascal | |
| 86 | 86 | uses androidutil; | |
| 87 | 87 | ||
| 88 | 88 | var | |
| 89 | 89 | MyDisplayMetrics: TDisplayMetrics; | |
| 90 | 90 | Str: string; | |
| 91 | 91 | // | |
| 92 | 92 | lHeight, lWidth: Integer; | |
| 93 | 93 | xdpi, ydpi, lScreenSize: Single; | |
| 94 | 94 | begin | |
| 95 | 95 | // .. | |
| 96 | 96 | // 객체 | |
| 97 | 97 | ||
| 98 | 98 | MyDisplayMetrics := TDisplayMetrics.Create; | |
| 99 | 99 | Activity.getWindowManager().getDefaultDisplay().getMetrics(MyDisplayMetrics); | |
| 100 | 100 | ``` | |
| 101 | 101 | ||
| 102 | 102 | 그리고 나면 TDisplayMetrics에 읽을 수 있다: | |
| 103 | 103 | ||
| 104 | 104 | ``` pascal | |
| 105 | 105 | lHeight := MyDisplayMetrics.heightPixels(); | |
| 106 | 106 | lWidth := MyDisplayMetrics.widthPixels(); | |
| 107 | 107 | xdpi := MyDisplayMetrics.xdpi(); | |
| 108 | 108 | ydpi := MyDisplayMetrics.ydpi(); | |
| 109 | 109 | lScreenSize := sqrt(sqr(lHeight / ydpi) + sqr(lWidth / xdpi)); | |
| 110 | 110 | ldensity := MyDisplayMetrics.density(); | |
| 111 | 111 | ldensityDpi := MyDisplayMetrics.densityDpi(); | |
| 112 | 112 | scaledDensity := MyDisplayMetrics.scaledDensity(); | |
| 113 | 113 | ``` | |
| 114 | 114 | ||
| 115 | 115 | 많은 장치가 xdpi 와 ydpi가 다르다. 그러므로 위에서 계산한 lScreenSize 를 믿지마라. 스마트폰이 10 인치로 되어 있더라도, 정확한 값은 4 주변이다. | |
| 116 | 116 | ||
| 117 | 117 | ## 안드로이드 기기에 대한 세부사항 | |
| 118 | 118 | ||
| 119 | 119 | 무척 많은 안드로이드 기기가 있이 때문에, 기기에 대한 몇가지 정보를 추적하는 것이 유용할 수 있다. 안드로이드 기기에 대해 위키피디아에서 비교한 \[ <http://en.wikipedia.org/wiki/Comparison_of_Android_devices>\] 것과\[<https://wiki.mozilla.org/Mobile/Platforms/Android#System_Requirements%5D에> 있는 프로세서의 자세한 명세를 읽어봐야 한다. | |
| 120 | 120 | ||
| 121 | 121 | ### 스마트폰 | |
| 122 | 122 | ||
| 123 | 123 | | 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 | | |
| 124 | 124 | |----|----|----|----|----|----|----| | |
| 125 | 125 | | HTC | Wildfire | HTC Wildfire | armv6 | 2.1=\>2.2 | Yes\|\|- | | | |
| 126 | 126 | | Sony Erricson | Xperia X10 | X10i | armv7 | 1.6=\>2.1 | No\|\|- | | | |
| 127 | 127 | ||
| 128 | 128 | ### 태블릿 | |
| 129 | 129 | ||
| 130 | 130 | | 제조사 | 모델 | 안드로이드 API 이름 (빌드.모델) | 프로세서 | 안드로이드 버전 | 멀티터치 | 기타 | | |
| 131 | 131 | |----|----|----|----|----|----|----| | |
| 132 | 132 | | Toshiba | Folio 100 Tablet | TOSHIBA_FOLIO_AND_A | armv7 | 2.2 | Yes\|\|- | | | |
| 133 | 133 | ||
| 134 | 134 | ### 프로세서 호환(ARMv6 vs ARMv7) 순서에 따른 기기 리스트 | |
| 135 | 135 | ||
| 136 | 136 | **ARMv7 기기리스트:** | |
| 137 | 137 | ||
| 138 | 138 | - Advent Vega (P10AN01) | |
| 139 | 139 | - Dell Streak, Streak 7 | |
| 140 | 140 | - HTC Desire | |
| 141 | 141 | - HTC Desire Z (T-Mobile G2) | |
| 142 | 142 | - HTC Desire HD | |
| 143 | 143 | - HTC Droid Incredible | |
| 144 | 144 | - HTC EVO 4G, EVO Shift 4G | |
| 145 | 145 | - HTC Glacier (T-Mobile myTouch 4G) | |
| 146 | 146 | - HTC Inspire 4G | |
| 147 | 147 | - HTC Nexus One | |
| 148 | 148 | - HTC Thunderbolt 4G | |
| 149 | 149 | - Huawei Ideos S7 | |
| 150 | 150 | - LG Optimus Z | |
| 151 | 151 | - Motorola Atrix 4G | |
| 152 | 152 | - Motorola Bravo | |
| 153 | 153 | - Motorola Cliq 2 - untested | |
| 154 | 154 | - Motorola Defy | |
| 155 | 155 | - Motorola Droid 2, Droid 2 Global | |
| 156 | 156 | - Motorola Droid Pro (Motorola PRO) | |
| 157 | 157 | - Motorola Droid X | |
| 158 | 158 | - Motorola Xoom | |
| 159 | 159 | - POV Mobii Tegra Tablet | |
| 160 | 160 | - Samsung Continuum (i400) | |
| 161 | 161 | - Samsung Galaxy S (i9000, Captivate, Fascinate, Vibrant, Epic 4G) | |
| 162 | 162 | - Samsung Galaxy Tab | |
| 163 | 163 | - Sharp IS03 | |
| 164 | 164 | - Sony Ericsson Xperia X10 | |
| 165 | 165 | - Toshiba AS100 | |
| 166 | 166 | - Viewsonic gTablet | |
| 167 | 167 | - Acer Liquid E | |
| 168 | 168 | - Acer Liquid (Liquid A1) | |
| 169 | 169 | - Archos 101 Internet Tablet | |
| 170 | 170 | - Motorola Charm | |
| 171 | 171 | - Motorola Droid (Milestone) | |
| 172 | 172 | - Samsung Galaxy S 4G | |
| 173 | 173 | - Samsung Nexus S | |
| 174 | 174 | ||
| 175 | 175 | **ARMv6 프로세서 리스트:** | |
| 176 | 176 | ||
| 177 | 177 | - Android SDK 에뮬레이터 | |
| 178 | 178 | - Asus Garmin nuvifone A50 (T-Mobile Garminfone) | |
| 179 | 179 | - Augen GENTouch 78 Tablet | |
| 180 | 180 | - Coby Kyros Internet Tablet (MID7015) | |
| 181 | 181 | - Geeksphone One, Geeksphone Zero | |
| 182 | 182 | - HTC Aria | |
| 183 | 183 | - HTC ChaCha | |
| 184 | 184 | - HTC Dream (T-Mobile G1, Android Dev Phone 1) | |
| 185 | 185 | - HTC Droid Eris | |
| 186 | 186 | - HTC Espresso (T-Mobile myTouch 3G Slide) | |
| 187 | 187 | - HTC Hero (T-Mobile G2 Touch) | |
| 188 | 188 | - HTC Legend | |
| 189 | 189 | - HTC Magic (T-Mobile myTouch 3G, T-Mobile G1 Touch) | |
| 190 | 190 | - HTC Salsa | |
| 191 | 191 | - HTC Tattoo | |
| 192 | 192 | - HTC Wildfire | |
| 193 | 193 | - Huawei Ascend | |
| 194 | 194 | - Huawei Ideos U8150-B (T-Mobile Comet) | |
| 195 | 195 | - Huawei U8110 (T-Mobile Pulse Mini) | |
| 196 | 196 | - Huawei U8230 | |
| 197 | 197 | - LG Ally (Apex) (LG VS740) | |
| 198 | 198 | - LG GW620 (Eve, InTouch Max, LinkMe) | |
| 199 | 199 | - LG Optimus, Optimus M, Optimus T, Optimus S, Optimus V | |
| 200 | 200 | - LG Vortex | |
| 201 | 201 | - LG P500 | |
| 202 | 202 | - MAG iMiTO iM7 | |
| 203 | 203 | - vMAG iMiTO iM7S | |
| 204 | 204 | - Motorola Backflip | |
| 205 | 205 | - Motorola Citrus | |
| 206 | 206 | - Motorola Cliq (MB200) | |
| 207 | 207 | - Motorola Dext | |
| 208 | 208 | - Motorola Devour | |
| 209 | 209 | - Motorola i1 | |
| 210 | 210 | - Motorola Spice XT300 | |
| 211 | 211 | - Motorola Quench XT5 XT502 | |
| 212 | 212 | - Pandigital Novel | |
| 213 | 213 | - Samsung GT-S5570 Galaxy Mini | |
| 214 | 214 | - Samsung i5500 Galaxy 5 (Corby) | |
| 215 | 215 | - Samsung i5700 Galaxy Portal (Spica) | |
| 216 | 216 | - Samsung i5800 Galaxy 3 | |
| 217 | 217 | - Samsung i7500 Galaxy | |
| 218 | 218 | - Samsung Intercept | |
| 219 | 219 | - Samsung M900 Moment | |
| 220 | 220 | - Samsung S5830 Galaxy Ace | |
| 221 | 221 | - Samsung Transform | |
| 222 | 222 | - Sanyo ZIO M6000 | |
| 223 | 223 | - Sony Ericsson Xperia X8 | |
| 224 | 224 | - Sony Ericsson Xperia X10 Mini | |
| 225 | 225 | - Sony Ericsson Xperia X10 Mini Pro | |
| 226 | 226 | - Superpad 10.2" Tablet PC | |
| 227 | 227 | - Viewsonic ViewPad 7 Tablet | |
| 228 | 228 | - Velocity Micro T103 Cruz tablet | |
| 229 | 229 | - Vodafone 845 | |
| 230 | 230 | - ZTE Blade | |
| 231 | 231 | ||
| 232 | 232 | ### 폰에서 사운드와 비디오 재생하기 | |
| 233 | 233 | ||
| 234 | 234 | 각각의 폰은 서로 다른 코덱이 설치되어 있어서 네이티브 미디어플레이어가 폰에 따라 다른 포멧으로 플레이 할 수가 있다는 것을 의미한다. 다음은 각 폰의 네이티브 미디어 플레이어가 어떤 포맷을 플레이하는지 모여주는 표이다: | |
| 235 | 235 | ||
| 236 | 236 | | 전화기 | 안드로이드 | webm - VP8 | m4v - H.264 | ogv - Theora | mp4 - H.264 | mov - H.264 | avi - RLE | mpg - MPEG-1 | wmv - WM9 | 3gp - MPEG-4 | | |
| 237 | 237 | |----|----|----|----|----|----|----|----|----|----|----| | |
| 238 | 238 | | 에뮬레이터 | 1.6 | x | x | x | x | x | x | x | x | OK | | |
| 239 | 239 | | 에뮬레이터 | 2.1 | x | x | x | x | x | x | x | x | OK | | |
| 240 | 240 | | Nexus One | 2.2 | x | OK | x | OK | x | x | x | x | OK | | |
| 241 | 241 | | HTC Desire | 1.6 | x | OK | x | OK | x | x | x | OK | OK | | |
| 242 | 242 | | Toshiba Folio 100 | 2.2 | x | OK | x | OK | x | x | x | OK | OK | | |
| 243 | 243 | | Xperia X10 | 2.1 | x | OK | x | x | x | x | x | OK | OK | | |
| 244 | 244 | | Xperia X8 | 2.2 | x | OK | x | x | x | x | x | x | OK | | |
| 245 | 245 | | HTC Wildfire | 2.1 | x | OK | x | x | x | x | x | x | OK | | |
| 246 | 246 | | HTC Desire HD | 2.2 | x | OK | x | OK | x | x | x | x | OK | | |
| 247 | 247 | | Galaxy Tab | 2.2 | x | OK | x | x | x | x | x | x | OK | | |
| 248 | 248 | | myPhone A210 | 1.6 | x | OK | x | x | x | x | x | x | OK | | |
| 249 | 249 | | Motorola Milestone | 2.1 | x | OK | x | x | x | x | x | OK | ? | | |
| 250 | 250 | | Milestone 2 | 2.2 | x | OK | x | x | x | x | x | 사운드만 | OK | | |
| 251 | 251 | ||
| 252 | 252 | ## 안드로이드 파일 시스템 | |
| 253 | 253 | ||
| 254 | 254 | 안드로이드는 어플리케이션이 데이터 디렉토리를 얻을 때 getApplicationContext().getFilesDir()의 사용을 추천하며 이 루틴은 HTC Wildfire에서는 /data/data/\<패키지 명\> 을 반환한다. | |
| 255 | 255 | ||
| 256 | 256 | 어플리케이션의 네이티브 라이브러리는 /data/data/\<패키지\>/lib 에 위치한다. | |
| 257 | 257 | ||
| 258 | 258 | 읽고 쓰고 새로운 파일을 생성하고 파일을 실행 시키기 좋은 곳은 /data/data/\<패키지 명\> 이다. | |
| 259 | 259 | ||
| 260 | 260 | ## 새로운 Java 어플리케이션의 생성 | |
| 261 | 261 | ||
| 262 | 262 | 이 정보는 LCL-CustomDrawn-Android의 구현을 도와주는데 유용할 수 있다. | |
| 263 | 263 | ||
| 264 | 264 | 일반적인 설명은 이곳에 있다: <http://developer.android.com/guide/developing/other-ide.html> | |
| 265 | 265 | ||
| 266 | 266 | ### 가상 키보드를 보이고 / 숨기기 | |
| 267 | 267 | ||
| 268 | 268 | 이곳을 보세요: <http://android-codes-examples.blogspot.com/2011/11/show-or-hide-soft-keyboard-on-opening.html> | |
| 269 | 269 | ||
| 270 | 270 | 나타내기: | |
| 271 | 271 | ||
| 272 | 272 | ``` pascal | |
| 273 | 273 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); | |
| 274 | 274 | imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0); | |
| 275 | 275 | ``` | |
| 276 | 276 | ||
| 277 | 277 | 키보드 감추기 위해서는: | |
| 278 | 278 | ||
| 279 | 279 | ``` pascal | |
| 280 | 280 | InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); | |
| 281 | 281 | imm.hideSoftInputFromWindow(singleedittext.getWindowToken(),0); | |
| 282 | 282 | ``` | |
| 283 | 283 | ||
| 284 | 284 | ## 안드로이드 JNI | |
| 285 | 285 | ||
| 286 | 286 | JNI (Java Native Interface)를 사용하여 대부분의 안드로이드 SDK API들과 다른 Java 라이브러리를 호출 할 수 있다. | |
| 287 | 287 | ||
| 288 | 288 | ### Java 타입과 파스칼 JNI 타입에 대한 표 | |
| 289 | 289 | ||
| 290 | 290 | 인터페이스를 제외한 모든 Java 타입들은 JNI에서 문제없이 표시할 수 있다. 각각의 Java 타입에 대해 javaEnvRef^^.GetMethodID 과 같이 루틴에서 사용되는 VM 타입에 대응하는 것이 존재한다. 또한 JNI 네이티브 타입이 있으며, 이는 lazarus/lcl/interfaces/customdrawn/android/jni.pas 유닛에 선언되어 있고 파스칼로 작성된 JNI 코드에서 이용되는 타입이어야 한다. 파스칼에서 동등한 타입이 비교를 위해 제공 되며, JNI 코드를 작성할 때는 jni.pas 에서 선언된 타입이어야 한다. | |
| 291 | 291 | ||
| 292 | 292 | | Java Types | VM 시그너쳐 | jni.pas에서의 Types | 파스칼에서 | 설명 | | |
| 293 | 293 | |----|----|----|----|----| | |
| 294 | 294 | | boolean | Z | jboolean | Boolean | | | |
| 295 | 295 | | byte | B | jbyte | Byte | | | |
| 296 | 296 | | char | C | jchar | Word | | | |
| 297 | 297 | | short | S | jshort | Shortint | | | |
| 298 | 298 | | int | I | jint | Integer | | | |
| 299 | 299 | | long | J | jlong | Int64 | | | |
| 300 | 300 | | float | F | jfloat | Single | | | |
| 301 | 301 | | double | D | jdouble | Double | | | |
| 302 | 302 | | a class, ie: String or InputStream | L\<full class name\> ie: Ljava/lang/String; | jobject | N/A | | | |
| 303 | 303 | | Array, ie: int\[\] | \[\<type-name\> ie: \[I | N/A | | | | |
| 304 | 304 | | A method type | (arg-types)ref-type | JMethodID | N/A | | | |
| 305 | 305 | | void | V | N/A | procedure | | | |
| 306 | 306 | ||
| 307 | 307 | ### 예제 1: Java 오브젝트를 생성하고 Java 메서드를 호출하기 | |
| 308 | 308 | ||
| 309 | 309 | 다음 Java 코드에 대응하는 파스칼 JNI 코드를 원한다고 하자. | |
| 310 | 310 | ||
| 311 | 311 | ``` java | |
| 312 | 312 | HttpGet javaRequest = new HttpGet(); | |
| 313 | 313 | URI myURI = new URI("http://magnifier.sourceforge.net/"); | |
| 314 | 314 | javaRequest.setURI(myURI); | |
| 315 | 315 | ``` | |
| 316 | 316 | ||
| 317 | 317 | 먼저 프로세스에 포함되는 모든 Class ID를 얻어야 한다. 그리고 나서 사용할 모든 메서드의 ID를 얻고 호출을 한다. 만약 호출이 파라메터를 가진다면, 배열로 전달한다. 다음 파스칼 네이티브 코드는 위의 Java 코드에 대응한다: | |
| 318 | 318 | ||
| 319 | 319 | ``` pascal | |
| 320 | 320 | uses jni, customdrawnint; | |
| 321 | 321 | ||
| 322 | 322 | var | |
| 323 | 323 | javaClass_HttpGet, javaClass_URI: jclass; | |
| 324 | 324 | javaMethod_HttpGet_new, javaMethod_HttpGet_setURI, | |
| 325 | 325 | javaMethod_URI_new: jmethodid; | |
| 326 | 326 | javaRequest, javaURI: jobject; | |
| 327 | 327 | javaString: jstring; | |
| 328 | 328 | lParams: array[0..2] of JValue; | |
| 329 | 329 | lNativeString: PChar; | |
| 330 | 330 | begin | |
| 331 | 331 | DebugLn(':>LoadHTMLPageViaJNI'); | |
| 332 | 332 | // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다. | |
| 333 | 333 | javaClass_HttpGet := javaEnvRef^^.FindClass(javaEnvRef, | |
| 334 | 334 | 'org/apache/http/client/methods/HttpGet'); | |
| 335 | 335 | javaClass_URI := javaEnvRef^^.FindClass(javaEnvRef, | |
| 336 | 336 | 'java/net/URI'); | |
| 337 | 337 | ||
| 338 | 338 | // 이제 모든 메서드 ID를 얻는다 | |
| 339 | 339 | DebugLn(':LoadHTMLPageViaJNI 1'); | |
| 340 | 340 | javaMethod_HttpGet_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, '<init>', '()V'); | |
| 341 | 341 | javaMethod_HttpGet_setURI := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_HttpGet, 'setURI', '(Ljava/net/URI;)V'); | |
| 342 | 342 | javaMethod_URI_new := javaEnvRef^^.GetMethodID(javaEnvRef, javaClass_URI, '<init>', '(Ljava/lang/String;)V'); | |
| 343 | 343 | ||
| 344 | 344 | // HTTP 응답 객체에 대한 새로운 인스턴스를 생성한다 | |
| 345 | 345 | // HttpGet javaRequest = new HttpGet(); | |
| 346 | 346 | javaRequest := javaEnvRef^^.NewObject(javaEnvRef, | |
| 347 | 347 | javaClass_HttpGet, | |
| 348 | 348 | javaMethod_HttpGet_new); | |
| 349 | 349 | ||
| 350 | 350 | DebugLn(':LoadHTMLPageViaJNI 4 javaRequest='+IntToHex(PtrInt(javaRequest), 8)); | |
| 351 | 351 | // 응답 객체에 URI를 추가한다 | |
| 352 | 352 | // URI javaURI = new URI("http://magnifier.sourceforge.net/"); | |
| 353 | 353 | lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, 'http://magnifier.sourceforge.net'); | |
| 354 | 354 | javaURI := javaEnvRef^^.NewObjectA(javaEnvRef, | |
| 355 | 355 | javaClass_URI, javaMethod_URI_new, @lParams[0]); | |
| 356 | 356 | javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l); | |
| 357 | 357 | // javaRequest.setURI(javaURI); | |
| 358 | 358 | lParams[0].l := javaURI; | |
| 359 | 359 | javaEnvRef^^.CallVoidMethodA(javaEnvRef, javaRequest, | |
| 360 | 360 | javaMethod_HttpGet_setURI, @lParams[0]); | |
| 361 | 361 | ``` | |
| 362 | 362 | ||
| 363 | 363 | ### 예제 2: 정적 메서드 호출 | |
| 364 | 364 | ||
| 365 | 365 | Bass 클래스에 있는 다음 정적 메서드를 호출하기를 원한다고 하자. <http://jerome.jouvie.free.fr/nativebass/javadoc/org/jouvieje/bass/Bass.html> | |
| 366 | 366 | ||
| 367 | 367 | ``` java | |
| 368 | 368 | public static native int BASS_StreamCreateFile(String file, long offset, long length, int flags); | |
| 369 | 369 | ``` | |
| 370 | 370 | ||
| 371 | 371 | 먼저 프로세스에 포함된 모든 Class ID를 얻고 정적 메서드의 ID를 얻으며 배열과 함께 파라메터를 넣어 호출한다: | |
| 372 | 372 | ||
| 373 | 373 | ``` pascal | |
| 374 | 374 | uses jni, customdrawnint; | |
| 375 | 375 | ||
| 376 | 376 | var | |
| 377 | 377 | javaClass_Bass: jclass; | |
| 378 | 378 | javaMethod_Bass_BASS_StreamCreateFile: jmethodid; | |
| 379 | 379 | javaString: jstring; | |
| 380 | 380 | lParams: array[0..3] of JValue; | |
| 381 | 381 | lRetInt: jint; | |
| 382 | 382 | begin | |
| 383 | 383 | // 먼저 필요한 모든 클래스에 대하여 FindClass를 콜한다. | |
| 384 | 384 | javaClass_Bass := javaEnvRef^^.FindClass(javaEnvRef, 'org/jouvieje/bass/Bass'); | |
| 385 | 385 | ||
| 386 | 386 | // 모든 메서드 ID | |
| 387 | 387 | javaMethod_Bass_BASS_StreamCreateFile := javaEnvRef^^.GetStaticMethodID(javaEnvRef, javaClass_Bass, 'BASS_StreamCreateFile', '(Ljava/lang/String;JJI)I'); | |
| 388 | 388 | ||
| 389 | 389 | // 호출한다. | |
| 390 | 390 | lParams[0].l := javaEnvRef^^.NewStringUTF(javaEnvRef, '/path/to/file'); | |
| 391 | 391 | lParams[1].j := 0; // 오프셋 | |
| 392 | 392 | lParams[2].j := 200; // 길이 | |
| 393 | 393 | lParams[3].i := 0; // 플래그 | |
| 394 | 394 | lRetInt := javaEnvRef^^.CallStaticIntMethodA(javaEnvRef, javaClass_Bass, javaMethod_Bass_BASS_StreamCreateFile, @lParams[0]); | |
| 395 | 395 | javaEnvRef^^.DeleteLocalRef(javaEnvRef, lParams[0].l); | |
| 396 | 396 | ``` | |
| 397 | 397 | ||
| 398 | 398 | ## 참고 | |
| 399 | 399 | ||
| 400 | 400 | - <http://developer.android.com/guide/developing/other-ide.html> | |
| 401 | 401 | ||
| 402 | 402 | --- | |
| 403 | 403 | *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).* | |
| 404 | 404 | Category: Android/ko |
