Flutter: ํ”Œ๋Ÿฌ๊ทธ์ธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ C/C++์™€ ํ†ตํ•ฉ ์ง€์›

์— ๋งŒ๋“  2016๋…„ 11์›” 28์ผ  ยท  174์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: flutter/flutter

C/C++ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์˜ˆ๋‚˜ ์ตœ์†Œํ•œ Flutter ์•ฑ๊ณผ ํ•จ๊ป˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ˆœ์ „ํžˆ Gradle ์งˆ๋ฌธ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Gradle ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ(์˜ˆ: ์ €)์—๊ฒŒ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๊ด€๋ฆฌ์ž ์˜๊ฒฌ: ํ˜„์žฌ ์ƒํƒœ ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด๋Š” https://github.com/dart-lang/sdk/issues/34452 ๋ฅผ ์ฐธ์กฐ

dart engine framework platform-android plugin new feature

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ช‡ ๊ฐ€์ง€ Google ์•ฑ์—์„œ ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์•ฑ ์ค‘ ํ•˜๋‚˜๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ๋ฅผ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ ์ž์ฒด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ž‘๋™ํ•˜๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์•ฑ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ PlatformChannel + JNI๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ํ•˜๋ฉด Android์—์„œ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • Android์™€ iOS ๊ตฌํ˜„ ๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก C++๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณ ๊ธ‰ ๋ชจ๋ฐ”์ผ ํŒ€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ง์ ‘ ํ†ตํ•ฉ์„ ์ง€์›ํ•˜๋Š” Flutter๋Š” ์ตœ๊ณ ์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ์ž…์ง€๋ฅผ ๋”์šฑ ๊ณต๊ณ ํžˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด _ํ•„์ˆ˜ํ’ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Flutter๊ฐ€ ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†”๋ฃจ์…˜๊ณผ ๋”์šฑ ์ฐจ๋ณ„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  174 ๋Œ“๊ธ€

@jason-simmons๋Š” Gradle์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. .so๊ฐ€ ์žˆ์œผ๋ฉด ๋กœ๋“œํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

buildSrc ์•„๋ž˜์— gradle ๋นŒ๋“œ ๋ฒ„์ „์„ ์„ค์ •ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์†์„ฑ์ด ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. 2.2.2๋กœ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ์ง„ํ–‰ํ–ˆ๊ณ  .so ๋กœ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  Java์—์„œ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” C/C++ ์ฝ”๋“œ์—์„œ Dart๋กœ HostMessage๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ C API๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋ถ€ํƒํ•ฉ๋‹ˆ๋‹ค. C->Java ์ฝœ๋ฐฑ์ด ์ €๋ ดํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜์‹ฌ์ด ๋“ญ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ปดํŒŒ์ผ๋œ C++ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด Flutter๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๊ฒƒ์ด ์œ ์ผํ•œ ์ฃผ์š” ์ค‘์ง€ ์ง€์ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  ๊ฐ€๋Šฅํ•˜์ง€๋งŒ( @jtrunick ์€ ๊ทธ์˜ ๋ฐฐ์†ก ์•ฑ์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค), ๋จผ์ € Java ๋˜๋Š” Obj-C๋ฅผ ํ†ตํ•ด ๋ฐ˜์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, https://flutter.io/platform-channels/ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Dart์—์„œ Obj-C/Java๋กœ ํ†ต์‹ ํ•œ ๋‹ค์Œ Obj-C/Java์—์„œ C++ ์ฝ”๋“œ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋Š” ์ด์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ Obj-C/Java ํ†ต๊ณผ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Dart VM์€ C++๋กœ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฏ€๋กœ C ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋” ์‰ฌ์šด(์•ˆ์ „ํ•˜์ง€ ์•Š๋”๋ผ๋„) ๋ฐฉ๋ฒ•์ด ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ(์˜ˆ: dlopen์„ ํ†ตํ•ด)? ๊ธฐ๋ณธ(์•ˆ์ „ํ•˜์ง€ ์•Š์€/์‹คํ—˜์ ์ธ) ์ง€์›์„ ์œ„ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

Android ๋˜๋Š” ios์—์„œ https://www.dartlang.org/articles/dart-vm/native-extensions๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช‡ ๊ฐ€์ง€ Google ์•ฑ์—์„œ ์ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋Ÿฌํ•œ ์•ฑ ์ค‘ ํ•˜๋‚˜๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ๋ฅผ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ ์ž์ฒด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ž‘๋™ํ•˜๋„๋ก ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์•ฑ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ PlatformChannel + JNI๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ํ•˜๋ฉด Android์—์„œ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • Android์™€ iOS ๊ตฌํ˜„ ๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก C++๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณ ๊ธ‰ ๋ชจ๋ฐ”์ผ ํŒ€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ง์ ‘ ํ†ตํ•ฉ์„ ์ง€์›ํ•˜๋Š” Flutter๋Š” ์ตœ๊ณ ์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ์ž…์ง€๋ฅผ ๋”์šฑ ๊ณต๊ณ ํžˆ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด _ํ•„์ˆ˜ํ’ˆ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ Flutter๊ฐ€ ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์†”๋ฃจ์…˜๊ณผ ๋”์šฑ ์ฐจ๋ณ„ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์•ฑ ์ค‘ ํ•˜๋‚˜๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์นด๋ฉ”๋ผ๋ฅผ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ ์ž์ฒด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. [...] ๊ฐ•์ œ๋กœ PlatformChannel + JNI๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ํ•˜๋ฉด Android์—์„œ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

C++์—์„œ Java๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Android์˜ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ด์—ˆ์Šต๋‹ˆ๊นŒ?

์ •๋ง ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ชจ๋ฐ”์ผ ํ”Œ๋žซํผ์—์„œ Dart ๊ธฐ๋ณธ ํ™•์žฅ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ dart_api.h ์˜ ๊ธฐํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์œ„์น˜๋ฅผ ์ „ํ™˜ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • AOT ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ Flutter ์—”์ง„ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ๋ฉ”์„œ๋“œ์—์„œ ์˜ค๋Š” ์œ ์ผํ•œ ์ง„์ž…์ ์ธ Dart ์ฝ”๋“œ๋ฅผ ์ธ์‹ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŠธ๋ฆฌ ์‰์ดํ‚น ํŒจ์Šค๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ํ™•์žฅ(Android ๋ฐ iOS์šฉ ๊ฐ๊ฐ Gradle ๋ฐ Xcode) ๋นŒ๋“œ ๋ฐ ํŒจํ‚ค์ง•์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • dart_api.h ์˜ ๋ฃจํ‹ด์— ๋Œ€ํ•ด ์ผ๋ถ€ ABI ์•ˆ์ •์„ฑ ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์•ˆ์ •์ ์ด์ง€๋งŒ ๋‹ค์–‘ํ•œ ๋ชจ๋“œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ ์ง„ํ™”ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ํ”Œ๋žซํผ ์ฑ„๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋” ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

C++์—์„œ Java๋กœ ๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Android์˜ ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ด์—ˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๋“ค์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊นŠ์ด ๋“ค์—ฌ๋‹ค๋ณด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. C++์—์„œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋งค์šฐ ์งง์€ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— JNI๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค(๋‚ด ์ง๊ฐ์€ ์•„๋‹ˆ์˜ค).

Flutter ์ธก์—์„œ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. JNI๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅธ interop์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ํŒ€์—๊ฒŒ ํฐ ์Šน๋ฆฌ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ C++ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ถ•์†Œํ•˜๊ณ  ์•ฑ ์ธก์œผ๋กœ ๋” ๋งŽ์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Interop ์„ฑ๋Šฅ์ด JNI์™€ ๋น„์Šทํ•˜๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ํฐ ์Šน๋ฆฌ๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์„ ๊ณ„์†ํ•˜๊ณ  PlatformChannel์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ด๋Ÿฌํ•œ ํŒ€์ด Flutter๋กœ ์ „ํ™˜ํ•  ์ถ”๊ฐ€ ์ด์œ ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฐจ๋‹จ์ด๋ผ๋Š” ๋ง์„ ๋“ค์–ด ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ ๊ทธ์— ๋”ฐ๋ผ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.

๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ํ˜„์žฌ ์†”๋ฃจ์…˜์€ Java์˜ ์ตœ์†Œํ•œ์˜ ๋…ผ๋ฆฌ๋กœ C++์˜ ๋ชจ๋“  ๋…ผ๋ฆฌ(์นด๋ฉ”๋ผ+UI)๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด๋ฉฐ ์ด ๋…ผ๋ฆฌ์˜ UI ๋ถ€๋ถ„์„ Dart๋กœ ์˜ฎ๊ธฐ๊ณ ์ž ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง์€ UI<->์นด๋ฉ”๋ผ ์ƒํ˜ธ ์ž‘์šฉ์„ ์žƒ์ง€ ์•Š๊ณ .

๊ทธ๋“ค์˜ ์Šค๋ ˆ๋”ฉ ์ƒํ™ฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์นด๋ฉ”๋ผ+UI์šฉ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์Šต๋‹ˆ๊นŒ?

@chinmaygarde ๋Š” ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+1

์ด ๋ฌธ์ œ์— ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ djinni ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๋กœ์ง์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Java/Objc-C๋ฅผ ํ†ตํ•ด ์™”๋‹ค ๊ฐ”๋‹ค ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค Dart์™€ C++ ์‚ฌ์ด์— ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Dart๊ฐ€ C/C++์™€ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ชจ๋ฐ”์ผ์—์„œ ์ˆ˜๋งŽ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  JNI ๋˜๋Š” Objective C++๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํ”Œ๋žซํผ์— ๋ฐ”์ธ๋”ฉํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์ข‹์€ ์•„์ด๋””์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/mono/CppSharp ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ

Realm๊ณผ ๊ฐ™์€ C++ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ C++์— ์ง์ ‘ ํ†ตํ•ฉํ•˜๋ฉด ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ๊ณผ ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :-) JNI๋ฅผ ํ†ตํ•ด ์œ„/์•„๋ž˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ปดํ“จํ„ฐ ๋น„์ „(์•„๋งˆ๋„ OpenCV ์‚ฌ์šฉ)์„ ์ˆ˜ํ–‰ํ•˜๋Š” AR ์•ฑ์šฉ Flutter๋ฅผ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํšจ์œจ์ ์ด๊ณ  ์ง์ ‘์ ์ธ Dart-C++ ์ƒํ˜ธ ์šด์šฉ์„ฑ์ด ์ฃผ์š” ๊ธ์ •์ ์ธ ํฌ์ธํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ„์‚ฐ ์ธก๋ฉด์—์„œ ๊นŒ๋‹ค๋กœ์šด ์•ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

C++ interop์„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ˆ„๊ตฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@tofutim Direct c/c++ interop์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๊ฐ€ ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋žซํผ ์ฑ„๋„ ์„ ์‚ฌ์šฉํ•œ ๋‹ค์Œ Obj-C/Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ C++ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„๋Œ€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

C++ interop์„ ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ˆ„๊ตฐ๊ฐ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ”Œ๋žซํผ ์ฑ„๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ˜„์žฌ ๊ถŒ์žฅ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํ™•์žฅ ๋ฌธ์„œ์— ์„ค๋ช…๋œ ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ dart_api.h ์—์„œ ๋…ธ์ถœ๋œ ๊ธฐํ˜ธ์— ๋Œ€ํ•œ ABI ์•ˆ์ •์„ฑ ๋ณด์žฅ์— ๋Œ€ํ•ด @eseidelGoogle ์ด ๊ทธ๋Ÿฌํ•œ ๋ณด์žฅ์ด ์กด์žฌํ•จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‚˜๋Š” ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ํ•ด๋‹น ๊ธฐํ˜ธ๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ C++์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก C API ์ฃผ๋ณ€์˜ ํŽธ๋ฆฌํ•œ ๋ž˜ํผ๋กœ Tonic ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ดํ•ด๋Š” ์ด ๋ฒ„๊ทธ๊ฐ€ C-API ๋ฐ ๋„๊ตฌ ํ›„ํฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์™„์ „ํžˆ C/C++ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‰ฝ๊ฒŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(Obj-C/Java shimming์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ platform_channels์„ ํ†ตํ•ด ๋น„๋™๊ธฐํ™”๋จ).

ํ˜„์žฌ๋กœ์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ™•์žฅ๊ณผ ๊ฐ™์€ ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์†”์งํžˆ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ @Hixie ๋˜๋Š” @cbracken์œผ๋กœ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค).

@seidel

ํ˜„์žฌ๋กœ์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ™•์žฅ๊ณผ ๊ฐ™์€ ๋™๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ๋Ÿฐ ๊ฒ๋‹ˆ๊นŒ?

C ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ Dart -> Java -> C
์šฐ๋ฆฌ๋Š” JNI๋ฅผ ๋‘ ๋ฒˆ ๊ต์ฐจํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ: ํ”Œ๋žซํผ ์ฑ„๋„์„ ํ†ตํ•ด dart ์—์„œ Java ๋กœ(ํ›„๋“œ์—์„œ JNI ํ˜ธ์ถœ ์‚ฌ์šฉ, ๋งž์ฃ ?)
๋‘ ๋ฒˆ์งธ: Java -> JNI ๋ฅผ ํ†ตํ•œ C

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์˜ ๊ด€์ ์—์„œ ์•ˆ์ •์„ฑ ๋ณด์žฅ ์—†์ด๋„ dart_api.h ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์œผ๋ฉด(์˜ˆ: ์‹คํ—˜ ๊ธฐ๋Šฅ์œผ๋กœ) ์ด๋ฏธ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ๋งˆ์ƒฌ๋ง ๋ฐ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  Dart ์ชฝ์—์„œ C ์ชฝ์œผ๋กœ ํฐ ์ด์ง„ ๋ฐ์ดํ„ฐ(์ด๋ฏธ์ง€) ๋ฉ์–ด๋ฆฌ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Unity/Mono ๋Š” ์ด๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค .

dart-sdk ๋ฌธ์ œ 31960 ์—์„œ ํ˜„์žฌ ๊ฒฉ๋ฆฌ ๊ตฌํ˜„์ด ๋ณต์‚ฌ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค(์ด๋ก ์ ์œผ๋กœ๋Š” ๊ฒฉ๋ฆฌ A์—์„œ ์ƒ์„ฑ๋œ ๋ฒ„ํผ๊ฐ€ ๊ฒฉ๋ฆฌ B์— ์ „๋‹ฌ๋œ ํ›„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋”ฐ๋ผ์„œ ํ•ด๋‹น ์†Œ์œ ๊ถŒ์€ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์–‘๋„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „๋ฉด์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์—†์Šต๋‹ˆ๊นŒ?), ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ๊ฒฉ๋ฆฌ ๋‚ด์—์„œ C ๋กœ/์—์„œ ๋งˆ์ƒฌ๋ง์ด ์—†๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ณง ๋„์ฐฉํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ํ”Œ๋žซ ๋ฒ„ํผ๋กœ ๋งˆ์ƒฌ๋ง์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/google/flatbuffers/pull/4676
๋˜๋Š” ๋‹จ์ผ ๋ฐ”์ดํŠธ ์ „์šฉ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” protobuf ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜.

๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋งŽ์€ ์–‘์˜ ๋ฐ”์ดํŠธ ๋ณต์‚ฌ๋ฅผ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์— ์ œ์‹œ๋œ ์ ์–ด๋„ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์š•๋ง์„ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Java/Obj-C ๊ธ€๋ฃจ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด C/C++ ์ฝ”๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ Flutter์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ €์˜ ์›๋ž˜ ์ดํ•ด์˜€์œผ๋ฉฐ ํ™•์‹คํžˆ ํ•  ์ˆ˜/ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค) .
  2. ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ Dart ์•ˆํŒŽ์œผ๋กœ ๋น ๋ฅด๊ฒŒ/๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค. (์•„๋งˆ๋„ C++๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์–ธ์–ด์—์„œ ์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ํƒ€๋‹นํ•œ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค! ์˜ˆ์ œ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณ„๋„์˜ ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.)
  3. ๋™๊ธฐ ํ˜ธ์ถœ/๊ฐ์ฒด๋กœ Dart๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? (์˜ˆ: ๊ธฐ๋ณธ ํ™•์žฅ ๋˜๋Š” ๊ธฐํƒ€ ๋ฐฉ๋ฒ•? ์ด ๋˜ํ•œ ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. API ์•ˆ์ •์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ž ์žฌ์ ์ธ ์–ด๋ ค์›€์ด ์žˆ์œผ๋ฉฐ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.)

์œ„์˜ ๋‚ด์šฉ์„ ์ฝ์€ ํ›„ ํ”ผ๋“œ๋ฐฑ์€ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋ฒ„๊ทธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ C++ inter-op์— ์•ฝ๊ฐ„์˜ ํˆฌ์ž๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์ด ๊ธด ์Šค๋ ˆ๋“œ์—์„œ ์–ด๋–ค ์ •ํ™•ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ์›ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ ํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ ์˜์—ญ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๊ด€์‹ฌ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์—ด์–ด ๋‘๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ๊ณผ ๊ด€๋ จํ•˜์—ฌ 2. ์œ„: Flutter์˜ platform_channels ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ(๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ/์ƒํ˜ธ ์šด์šฉ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ) ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์ฒด์ ์ธ ์‚ฌํ•ญ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Flutter์˜ platform_channels ์„ฑ๋Šฅ์ด ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ธฐ ์ „์— ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€(์•„๋งˆ๋„ ์กด์žฌํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณธ ์ ์ด ์—†์„๊นŒ์š”?). ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ๋‚˜์˜ ๊ฒฝํ—˜์€ ๋‚ด ์ง๊ฐ์ด ์ข…์ข… ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JNI ๋˜๋Š” platform_channels์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์ž ์žฌ์ ์ธ ๋ณ‘๋ชฉ ํ˜„์ƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ์ธก์ •ํ•  ๋•Œ๊นŒ์ง€๋Š” ์‹ค์ œ๋กœ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋„์›€๊ณผ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

Java/Obj-C ๊ธ€๋ฃจ๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด C/C++ ์ฝ”๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ Flutter์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์›ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์ด ์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ €์˜ ์›๋ž˜ ์ดํ•ด์˜€์œผ๋ฉฐ ํ™•์‹คํžˆ ํ•  ์ˆ˜/ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค) .

๊ทธ๊ฒƒ์€ ๋˜ํ•œ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์œ„ํ•œ ๋” ๋‚˜์€ sqlite ํ†ตํ•ฉ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค + ํฌ๋ฆฝํ† , ssh ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ์œ„ํ•œ ์ˆ˜๋งŽ์€ C/Rust ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹๋”๋ผ๊ณ ์š”.

@seidel

๋‚˜๋Š” ์ ์–ด๋„ ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์š•๋ง์ด ์ œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํˆฌํ‘œ 1.)

Flutter ๋ฌธ์„œ๋ฅผ ์ฝ์œผ๋ฉด C๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ”Œ๋žซํผ ์ฑ„๋„์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ "๊ฐ„๋‹จ"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์œ ์ผํ•œ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์•„๋งˆ๋„ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— _๋™์  ๊ณต์œ  ๊ฐ์ฒด_๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_Android-C_-usage๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#include <ndk-version.h>
#include "methodchannel.h"
#include "methodchannels.h"

MethodChannel* flutter_channels;

__attribute__((constructor))
void
on_library_load() {
    flutter_channels = NULL;
}

__attribute__((destructor))
void
on_library_unload() {
    while (MethodChannel* channel = MethodChannels_pop(flutter_channels)) {
        MethodChannel_delete(channel);
    }
}

#define str(a) #a

void
{{pluginClass}}_on_method_call(MethodCall* call, Result* result) {
    if (strcmp("getPlatformVersion", call.method) == 0) {
        Result_success(result, "Android " str(__NDK_BUILD__));
    } else {
        Result_not_implemented();
    }
}

void
{{pluginClass}}_register_with(Registrar* registrar) {
    MethodChannel* channel = MethodChannel_new(Registrar_messenger(registrar), "{{projectName}}");
    flutter_channels = MethodChannels_push(flutter_channels, channel);
    MethodChannel_set_call_handler({{pluginClass}}_on_method_call)
}

๊ฐœ๋…์ ์œผ๋กœ ์ตœ์†Œํ•œ _Android-C_์˜ ๊ฒฝ์šฐ Java์™€ C์˜ ์กฐํ•ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@eseidelGoogle
์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ž๋ฐ”์™€ ์Šค์œ„ํ”„ํŠธ ๋ž˜ํผ๋ฅผ ํ†ตํ•ด golang ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ์ƒ๋‹นํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์™œ์š” ?

  • ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ํ”Œ๋žซํผ ๊ฐ„์— ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ณต์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ™”๋ฉด ๊ณต์œ ์™€ ๊ฐ™์€ ๋น„๋””์˜ค ๋ฐ ์ด๋ฏธ์ง€ ๊ธฐ๋Šฅ์šฉ.
  • DB์šฉ.

ํฌ์˜น ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค ์ง์ ‘์ ์ธ ์ˆ˜์ค€์—์„œ golang ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด!
๋ชจ๋ฐ”์ผ์šฉ golang ์ฝ”๋“œ ์ปดํŒŒ์ผ๋„ LDFLag ๋งˆ๋ฒ• ์—†์ด ๋งค์šฐ ์‰ฌ์›Œ์„œ ์ธ๊ธฐ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ํ˜„์žฌ Method Channels๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ golang ์ฝ”๋”๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ง๋ ฌํ™”์— ๊ด€ํ•ด์„œ๋Š” ํ˜„์žฌ Protobufs์™€ ํ”Œ๋žซ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:
https://github.com/dnfield/flatbuffers/blob/master/samples/sample_binary.go

์žํ™์ƒ‰์—์„œ ์ด๊ฒƒ์€ FIDL๋กœ ์ˆ˜ํ–‰๋˜๋ฉฐ c, rust ๋ฐ golang์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•˜๊ธฐ์— ๊ฝค ํ›Œ๋ฅญํ•˜๊ณ  ์ž„๋ฒ ๋””๋“œ ๋ณด๋“œ์—์„œ ๋…น๊ณผ golang์„ ์‹œํ—˜ํ•ด ๋ณด๋Š” ๊ฒƒ์„ ์ฆ๊ฒผ์Šต๋‹ˆ๋‹ค.

iOS ๋ฐ Java๋ฅผ ํ†ตํ•ด fidl ํ•ญ๋ชฉ์„ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ๋ชจ๋ฐ”์ผ๊ณผ ๋ฐ์Šคํฌํƒ‘์—์„œ ์žํ™์ƒ‰๊ณผ ํ”Œ๋Ÿฌํ„ฐ ์‚ฌ์ด์— ์ข‹์€ ์ง„์ž…๋กœ๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ์ƒ๊ฐ

@eseidelGoogle
Hiix๋Š” FIDL์ด Fuchsia์— ์žˆ๋Š” zircon์˜ ์ปค๋„ ์ฝ”๋“œ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— Flutter ์ˆ˜์ค€์—์„œ FIDL์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Flutter ๋‚ด์—์„œ FIDL IPC ์Šคํƒ€์ผ ๊ธฐ๋Šฅ์„ ๋ณต์ œํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ Flutter ์—”์ง„์— FIDL ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€๋‹ค๊ฐ€ Flatbuffers์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Flutter์™€ cpp ์‚ฌ์ด์˜ ์ง๋ ฌํ™” ๋ ˆ์ด์–ด์— FlatBuffers๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Flutter์˜ golang ๋˜๋Š” rust ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ?

์ด๊ฒƒ์— +1ํ•˜๋ฉด Superpowered๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” flutter ์•ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Superpowered๋Š” C++๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ Java ๋ฐ JNI ์œ ํ˜• ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ณ  ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ Java ์ฝ”๋“œ์™€ ๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ค‘๊ฐ„ ์‚ฌ๋žŒ์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ Realm๊ณผ ๊ฐ™์€ ์ธ๊ธฐ ์žˆ๋Š” ๋ชจ๋ฐ”์ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•ต์‹ฌ์ด C/C++๋กœ ์ž‘์„ฑ๋˜๊ณ  java/objc/swift ์ค‘๊ฐœ์ž๋ฅผ ๋‹ค๋ฃจ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋Ÿฌํ„ฐ ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ผ๋ฐ˜์ ์ธ ์•ˆ์ •์„ฑ์„ ์ œ์™ธํ•˜๊ณ  ์ด ๋ฌธ์ œ๋Š” ํ˜„์žฌ Flutter์—์„œ ๊ฐ€์žฅ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋” ๊ตฌ์ฒด์ ์œผ๋กœ @eseidelGoogle ์˜ ๋ชฉ๋ก์—์„œ 1์œ„์ž…๋‹ˆ๋‹ค.)

ํ”Œ๋žซํผ ํ™•์žฅ์—์„œ Java/JNI๋ฅผ ์šฐํšŒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ฃผ์žฅ์„ ๋“ฃ๊ณ  ์‹ถ๋‹ค๋ฉด(์ฆ‰, ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Java ๊ธ€๋ฃจ ๋ ˆ์ด์–ด๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ) Superpowered๋Š” https://www.youtube ์—์„œ ํ•ด๋‹น ์ฃผ์ œ์— ๋Œ€ํ•ด ํ•  ๋ง์ด ๋งŽ์Šต๋‹ˆ๋‹ค

@pnico ์ด๊ฒƒ์ด Java/JNI๊ฐ€ ๋ฐ”์ดํŒจ์Šค๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ค๋””์˜ค ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ C++๋กœ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋งŽ์€ ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (์ฆ‰, JNI๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.)

@ csga5000 ๋‹น์‹ ์ด ์™„์ „ํžˆ ์˜ณ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ง์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. D JNI๋Š” ์•„๋งˆ๋„ ๋” ๋‚œํ•ดํ•œ ์ผ์„ํ•˜๋ ค๊ณ ํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ๋กœ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ •๋ง๋กœ ํŽธ๋ฆฌํ•จ/์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๊ท€๊ฒฐ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋” ๋งŽ์€ ์•ฑ๋ณ„ ์ฝ”๋“œ๋ฅผ Java/C++์—์„œ Dart๋กœ ์˜ฎ๊ธฐ๋Š” ๊ธฐ๋Šฅ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@pnico ๊ฐ€ JINI๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JINI๊ฐ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋„ˆ๋ฌด ๋งŽ์ด ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ
๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์˜ˆ ์•„๋‹ˆ์˜ค ??

์ด๊ฒƒ์€ ์ฃผ๋กœ ์•”ํ˜ธํ™” ๊ด€๋ จ ์ž‘์—…์— ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚˜๋Š” ์‹คํ—˜์„ ๋ณด๊ฑฐ๋‚˜ ๋งŒ๋“ค์ง€ ์•Š์•˜์ง€๋งŒ Android Things์— ๋Œ€ํ•ด ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
c๋‚˜ dart ๋ชจ๋‘์—์„œ ํƒ€์ด๋ฐ์— ๋ฏผ๊ฐํ•œ gpio์— ๋Œ€ํ•œ ๋ฒค์น˜๋งˆํฌ
๋…„๋„.

2018๋…„ 6์›” 9์ผ ํ† ์š”์ผ 10:52 Eddy WM, ์•Œ๋ฆผ @github.com ์ž‘์„ฑ:

์ด๊ฒƒ์€ ์ฃผ๋กœ ์•”ํ˜ธํ™” ๊ด€๋ จ ์ž‘์—…์— ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/flutter/flutter/issues/7053#issuecomment-395927258 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AFHMcSI2JDHbgv3iYrStDN5mlzkQ8XEkks5t6xxMgaJpZM4K-PLw
.

๊ทธ ์ดํ›„๋กœ ์–ด๋–ค ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ac/c++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ ํ”Œ๋Ÿฌํ„ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? djinni ๊ฐ€ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ๊ฐ€์š”?

ํ•ด๊ฒฐ๋  ๋•Œ๊นŒ์ง€ ๋„ค์ดํ‹ฐ๋ธŒ android ๋ฐ ios ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” c/c++๋ฅผ ํ†ตํ•ฉํ•œ ๋‹ค์Œ ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ dart ์ฝ”๋“œ์— ์ธํ„ฐํŽ˜์ด์Šคํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•

๋‚˜๋Š” ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค(jar ํŒŒ์ผ ๋ฐ CocoaPods์—). ๋™์ผํ•œ c/c++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์•ˆ๋“œ๋กœ์ด๋“œ ๋ฐ ios ๋ชจ๋‘)์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ฒœ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ mmcc007 Java ๋˜๋Š” swift์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ž๋ฐ”: https://www.google.com/search?client=opera&q=android+java+use+C%2B%2B&sourceid=opera&ie=UTF-8&oe=UTF-8

์Šค์œ„ํ”„ํŠธ: https://www.google.com/search?client=opera&q=swift+use+C%2B%2B&sourceid=opera&ie=UTF-8&oe=UTF-8

๋‹น์‹ ์€ ๋‹น์‹ ์ด ์ •๋ง๋กœ ์˜ˆ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๊ฐ•๋ ฅ ํ•˜์ง„ ๊ถŒ์žฅ ๋ณผ ์ˆ˜์žˆ๋‹ค (์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๋‚ด๊ฐ€ ์•„๋Š”์ž…๋‹ˆ๋‹ค) : https://github.com/superpoweredSDK/Low-Latency-Android-iOS-Linux-Windows-tvOS-macOS- ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์˜ค๋””์˜ค ํ”Œ๋žซํผ
์˜ˆ์ œ ํด๋”๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด https://github.com/superpoweredSDK/Low-Latency-Android-iOS-Linux-Windows-tvOS-macOS-Interactive-Audio-Platform/tree/master/Examples_Android/SuperpoweredRecorder/app/src/main ์—๋Š” cpp/RecorderExample.cpp์˜ ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” java/com/superpowered/recorder/MainActivity.java

@csga5000 ์ฒซ ๋ฆฌ๋ทฐ๋กœ

์ด๊ฒƒ์— ๋Œ€ํ•ด +1. C++๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์˜ ๋ชจ๋“  ์ž‘๋™ ์˜ˆ์ œ๋Š” ํ˜ธํ‰์„ ๋ฐ›์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

golang์— ๋Œ€ํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋™์ผํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
C++์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

golang ํ”„๋กœ๊ทธ๋žจ์€ jsonrpc๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ jsonrpc๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์˜ golang ์ฝ”๋“œ๋ฅผ ์•ž์— ํ‘œ์‹œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ์ฑ„๋„์€ ๋ถˆ๊ฐ€์ง€๋ก ์  ์ง๋ ฌํ™”๋กœ JSON๋งŒ ์ง€์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ํ˜•์‹ ?

2018๋…„ 7์›” 18์ผ ์ˆ˜์š”์ผ 16:50 Jefferson Bledsoe, ์•Œ๋ฆผ @github.com
์ผ๋‹ค:

์ด๊ฒƒ์— ๋Œ€ํ•ด +1. C++๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์˜ ์ž‘๋™ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ž˜ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค

โ€”
๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/flutter/flutter/issues/7053#issuecomment-405958345 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ATuCwkPbb9vLdoaEwM-bLhYPZxtyQ5Vjks5uH0sqgaJpZM4K-PLw
.

์•ˆ๋…•ํ•˜์„ธ์š”, ์–ด๋–ค ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ์Šค๋ ˆ๋“œ์˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Superpowered ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Flutter ์•ฑ์— ์ง์ ‘ ํ†ตํ•ฉํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

์˜ˆ @skills-up ์šฐ๋ฆฌ ๊ฐ€ ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์„œ ๋‚ด ํŒ์„ ๋ณธ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ CPU ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ Flutter ์•ฑ์„ ๋นŒ๋“œํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹คํŠธ์—์„œ ์ง์ ‘์ ์œผ๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ JNI/Java๋ฅผ ํ†ตํ•ด ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ๋ณ„ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ CPU ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ Flutter ์•ฑ์„ ๋นŒ๋“œํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์•ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ง€์›๋˜๋Š” ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง€์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋‚˜์š”?

BTW, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ Java๋กœ ์ž‘์„ฑ๋œ ์ž‘๋™ํ•˜๋Š” ์•ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ iOS ์•ฑ๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ (Swift/XCode์— ๋…ธ๋ ฅ์„ ๋“ค์ด๋Š” ๋Œ€์‹ ) ํ”Œ๋Ÿฌํ„ฐ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋‹จ์ผ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ด์ ๊ณผ ํ•จ๊ป˜ ํ–ฅํ›„ ์œ ์ง€ ๊ด€๋ฆฌ ์ธก๋ฉด์—์„œ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž˜. Realm์€ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/realm/realm-object-server/issues/55

lukaspili : ๋‹ค๋“ค ์•„์ง ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”: flutter/flutter#7053
bmunkholm: @lukaspili ๋„ค, ๊ทธ๊ฑด ํ™•์‹คํžˆ ์ „์ œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋„ ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์ ์ ˆํ•œ ๋ฐฐ๊ด€์„ ์–ป์„ ๋•Œ๊นŒ์ง€ XF ์•ฑ์„ flutter๋กœ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์„ ์‹ค์ œ๋กœ ์กฐ์‚ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒํƒœ๋กœ Xamarin์€ ์ด ๋ถ€์„œ์—์„œ ๋ฌผ ๋ฐ–์œผ๋กœ ํŽ„๋Ÿญ์ž…๋‹ˆ๋‹ค.

์ด ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ์ง€๋งŒ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ํฐ +1์ž…๋‹ˆ๋‹ค.

์ €๋Š” ๋ฐ์Šคํฌํƒ‘ ์•ฑ์„ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ณด๊ธฐ๋Š” ํ•œ ์ค„์˜ ์ฝ”๋“œ(๋ฐ์Šคํฌํ†ฑ์šฉ)์ž…๋‹ˆ๋‹ค.

Flutter - Dart + C++ > Qt ? partyTime() : makeDoWithElectronOrQt()

Flutter๊ฐ€ C++์— ๋Œ€ํ•œ ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ง€์›์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด "๋ชจ๋ฐ”์ผ ์šฐ์„ "๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ์ ˆ๋Œ€์ ์ธ ์Šน์ž๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Qt๋Š” ์†Œ๊ทœ๋ชจ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋น„์‹ธ๊ณ  ๋…๋‹จ์ ์ด๋ฉฐ ํ˜„๋Œ€์ ์ธ C++๋ฅผ ์ˆ˜์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ๊ฒฝ์Ÿํ•  ๋งŒํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. Flutter๊ฐ€ UI ํŒŒ์ด์˜ ์ ์–ด๋„ ์ผ๋ถ€๋ฅผ ๋จน์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”์‹ : ์ €๋Š” ๋‹คํŠธ๋ฅผ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋˜ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด C#/Go/Rust/etc์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ํ”Œ๋žซํผ์—์„œ๋Š” ๋งค์šฐ ์ƒ์‚ฐ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ ์„ฑ๋Šฅ ๋ฐ์Šคํฌํƒ‘(์—ฌ๊ธฐ์„œ ๋‚ด ๊ด€์‹ฌ) ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์„ธ๊ณ„๋Š” ํ™•๊ณ ํ•œ C++์ด๋ฉฐ, ๊ด‘๋ฒ”์œ„ํ•œ OS ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์„ ์ œ๊ณตํ•˜๋ฉฐ, ์–ธ์–ด ์ž์ฒด๊ฐ€ ๋น ๋ฅธ ์†๋„๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C), Flutter๋Š” ๊ทธ๋Ÿด ์ž๊ฒฉ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š” ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— C++๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ง€๊ธˆ์€ ํ™•์‹คํžˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” Dart๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. C++๋กœ ์•ฑ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ์—๋„ ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” C++๊ฐ€ ๋ฐ์Šคํฌํƒ‘ ์ง€์›์œผ๋กœ ์ง์ ‘ ๋ณ€ํ™˜๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ƒ๋‹นํ•œ ์–‘์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ณ  dart VM์€ ์–ด์จŒ๋“  ๋ฐ์Šคํฌํƒ‘์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์„ฑ๋Šฅ์ด ๋ฌด์‹œํ•  ๋งŒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Google์€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ง€์›ํ•˜์—ฌ ์ง€์›๋˜๋Š” ์–ธ์–ด ๋˜๋Š” ํ•ด๋‹น ์–ธ์–ด์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ํ”Œ๋Ÿฌํ„ฐ ์•ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Fuchsia๊ฐ€ ์ถœ์‹œ๋  ๋•Œ๊นŒ์ง€๋Š” ๊ทธ๋ ‡๊ฒŒ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ทธ๋“ค์˜ ๋ชฉํ‘œ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Dart๋Š” ์‚ฌ์šฉ/๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์–ด์จŒ๋“  Google์˜ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ชฉํ‘œ์— ๋ถ€ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ธ‰ C++ ์ง€์›์„ ๋ฐ›๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์‹ค์งˆ์ ์ธ ์ด์ ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์€ ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋ฉฐ, C++๊ฐ€ ํฌํ•จ๋œ ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์€ ๋ฉด์—์„œ, ๋‹น์‹ ์€ ๊ทธ๋“ค์ด ๋ฐ์Šคํฌํƒ‘์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฐ๊ตญ flutter๋ฅผ ์˜๋„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ Fuchsia์˜ ์นดํ”ผ๋ฐ”๋ผ, ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋“ค์ด ๊ฑฐ๊ธฐ์„œ ๋ฉˆ์ถœ์ง€๋Š” ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค).

์ด ์Šค๋ ˆ๋“œ๋Š” dart/flutter์—์„œ ์ง์ ‘ ํ†ตํ•ฉ w/ C++๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์œผ๋กœ, ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ์ œ๊ณต๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‚˜๋Š” flutter๊ฐ€ C++๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ผ๊ธ‰ C++ ์ง€์›์„ ๋ฐ›๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์‹ค์งˆ์ ์ธ ์ด์ ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Flutter/Dart๊ฐ€ C++์— ๋น„ํ•ด ์–ผ๋งˆ๋‚˜ ๋›ฐ์–ด๋‚œ์ง€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ํ˜„์žฌ ์—์ฝ”์‹œ์Šคํ…œ์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํ†ตํ•ฉ์˜ ์š”์ /์‰ฌ์›€์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธด ๋ชฉ๋ก์€ ์—…๊ณ„ ํ‘œ์ค€์ธ ๊ณต์œ  ๊ฐœ์ฒด(์˜ˆ: OpenCV)๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด Dart์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์„ฑ๋Šฅ์€ ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋ฉฐ, C++๊ฐ€ ํฌํ•จ๋œ ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ์ •๋ฐ˜๋Œ€๋กœ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ด ์ปจํ…์ŠคํŠธ์—์„œ ์ฐจ์„ ์ฑ…์ž…๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ(์ด๋ฏธ์ง€)์—์„œ ํฐ ์ด์ง„ ๊ฐœ์ฒด๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
1- ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ C++ ๋ฉ”๋ชจ๋ฆฌ์—์„œ/๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
2- JNI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ธํ„ฐํŽ˜์ด์Šคํ•˜๊ณ  ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ํฌ์ธํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๊ฐ’/๋งค๊ฐœ๋ณ€์ˆ˜ ๋น„์šฉ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข‹์€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ทธ๊ฒƒ์ด ๋„์ž…ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ/ํŒจ๋Ÿฌ๋‹ค์ž„๊ณผ C++๊ฐ€ ์ผ๋ถ€์ธ ๊ฒƒ์„ ๋ถ€์ •ํ•  ์ˆ˜ ์—†๋Š” ํ˜„์žฌ ์—์ฝ”์‹œ์Šคํ…œ/๋ ˆ๊ฑฐ์‹œ์™€ ์–ผ๋งˆ๋‚˜ ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ฌ์ด์˜ ๊ท ํ˜•์ž…๋‹ˆ๋‹ค.

@nhachicha @csga5000 ์€ C++๋ฅผ ์ง์ ‘ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” Flutter๋ฅผ Dart ์ฝ”๋“œ ์—†์ด๋„ C++์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌป๋Š” ์ด์ „ ์˜๊ฒฌ์— ๋‹ตํ–ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์€ ๋ชจ๋ฐ”์ผ ์•ฑ์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋ฉฐ, C++๊ฐ€ ํฌํ•จ๋œ ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
@nhachicha ๋” ๋™์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ง„์‹ค์€ ์ด๋นจ์„ ๊นจ๋Š” ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(๋งŽ์Œ)์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋งˆ์Šคํ„ฐ C++๋ฅผ ๋” ์ƒ์‚ฐ์ ์ธ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ์‹ค Dart๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Dart๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋Œ€์ค‘์ /ํ™•๋ฆฝ) ์–ธ์–ด:

  • C#/.Net Core ๋Ÿฐํƒ€์ž„
  • Javascript/Typescript V8 ๋Ÿฐํƒ€์ž„
  • ๋…น(๋˜ํ•œ ๋น ๋ฆ„!)
  • ๊ณ ๋ž‘
  • ํŒŒ์ด์ฌ
  • [์—ฌ๊ธฐ์— ์ฆ๊ฒจ์ฐพ๊ธฐ ์‚ฝ์ž…]...

๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์–ธ์–ด ์ค‘ ์ผ๋ถ€๋ฅผ ๋งค์ผ ์‚ฌ๋ž‘ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋งŒํผ C ๋ฐ C++๋Š” Linux์˜ ํ•ต์‹ฌ์ด๋ฏ€๋กœ Android, iOS ๋ฐ Windows, MacOS ๋ฐ ๊ธฐํƒ€ ๋ฐ์Šคํฌํ†ฑ๊ณผ ๊ฐ™์€ ๋ฐ์Šคํฌํ†ฑ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์–ธ์–ด ์ค‘ ์ ˆ๋ฐ˜(Dart ํฌํ•จ)์€ C++๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ์€ AI(Tensorflow๋Š” C++, Caffe C++, Pytorch๋Š” Python์—์„œ C ๋“ฑ), ์ฆ๊ฐ• ํ˜„์‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, AAA ๊ฒŒ์ž„ ์—”์ง„ ๋ฐ GPU(CUDA)์— ๊ฐ€๊นŒ์›Œ์•ผ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์€ ์กฐ์ •๋œ ๊ธฐ๋ณธ ์„ฑ๋Šฅ์„ ๊ณ„์†ํ•ด์„œ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. , C/C++์—์„œ ํ˜ธ์ถœ๋จ).

Flutter ๋ Œ๋”๋ง ์—”์ง„ ์ž์ฒด๊ฐ€ C++ (๋„ค์ดํ‹ฐ๋ธŒ, ๊ณ ์„ฑ๋Šฅ, ๋ฐฐํ„ฐ๋ฆฌ/๋ฉ”๋ชจ๋ฆฌ/cpu ํšจ์œจ)๋กœ

_์ฐธ๊ณ ๋กœ ์ €๋Š” ์–‘์‹ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์—์„œ ํ”ฝ์…€ ์…ฐ์ด๋”์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์„ C/C++๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋ณด๊ณ  ์žˆ๋Š” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฌํ•ด์ธ ์ฒ™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งค์šฐ ์ƒ์‚ฐ์ ์ธ ์–ธ์–ด - ๊ทธ๋Ÿฌ๋‚˜ ์ „์ ์œผ๋กœ ๊ฐœ์ธ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค._

์ด๊ฒƒ์ด C++ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ์ฃผ์š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

https://github.com/realm/realm-object-server/issues/55

C/C++ ํ†ตํ•ฉ์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • C++์—์„œ ๋ฉ”์†Œ๋“œ ์ฑ„๋„ ๊ตฌํ˜„ ์ œ๊ณต
  • Dart VM ๊ธฐ๋ณธ ํ™•์žฅ ์ง€์› ์ œ๊ณต

๋ถˆํ–‰ํžˆ๋„ ์ด ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ตฌํ•˜๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ์ฃผ์š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ์ฑ„๋„์€ ๋†’์€ ์˜ค๋ฒ„ํ—ค๋“œ ์ถ”์ƒํ™”์ด๋ฉฐ ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ ์ƒํ˜ธ ์ž‘์šฉ์ด ๋ฐ”๋žŒ์งํ•  ๋•Œ C/C++ ํ†ตํ•ฉ์ด ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ• ์ฑ„๋„์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • Dart VM ๊ธฐ๋ณธ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‚ฌ๋žŒ๋“ค์ด Dart VM C API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ API๊ฐ€ ์˜ค๋ž˜๋˜์ง€ ์•Š๊ณ  ์‹ฌ๊ฐํ•œ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ์™ธ๋ถ€ ์ข…์†์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋ฐ”๋žŒ์งํ•œ ๋Œ€์•ˆ์€ dart:ffi ์˜ ๋„์ž…์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” Dart VM์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import 'dart:ffi' as ffi;

// Bind foo to symbol _foo from library libxyz.so with signature
// int32_t (int32_t, double, char*).
@ffi.import("libxyz.so", name: '_foo',
            signature: ffi.Signature(ffi.Int32, [ffi.Int32, ffi.Double, ffi.PChar]))
extern int foo(int foo, double x, String foo);

์šฐ๋ฆฌ๋Š” ์˜ค๋žซ๋™์•ˆ ์ด์™€ ๊ฐ™์€ FFI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ƒ๋‹นํ•œ ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๊นŒ์šด ์žฅ๋ž˜์— FFI๋ฅผ ์‹คํ—˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์ผ์ •์— ๋Œ€ํ•ด์„œ๋Š” ์•ฝ์†ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

@kirbyfan64 ๋งž์Šต๋‹ˆ๋‹ค, @nailgilaziev , @bytesoftly C++ ํ†ตํ•ฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ํ”Œ๋Ÿฌํ„ฐ ์ง€์›์„ C++ INPLACE of dart - ํ•˜์ง€๋งŒ ํ†ตํ•ฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. @mraleph ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

@mraleph The Dartino๋Š” FFI์— ๋Œ€ํ•ด ์œ ์‚ฌํ•œ ๊ตฌํ˜„์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€ํ™œํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๊นŒ?

@listepo์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. Dartino์˜ FFI ๊ตฌํ˜„์€ ๋งค์šฐ ์—ญ๋™์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Dart 1๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ •์ ์ธ Dart 2์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ฒŒ์ž„์— ๋Šฆ์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋ชฉ์ ์œผ๋กœ c ํŒŒ์ผ๊ณผ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹คํŠธ์— ํฌํ•จํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๋ผ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1) iOS ๋ฐ Android์šฉ ๋™์ผํ•œ ์ฝ”๋“œ, ์ฆ‰ ObjC ๋˜๋Š” JNI ๊ณ„์ธต์„ ๊ฑฐ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
2) ์˜ˆ๋ฅผ ๋“ค์–ด JNI๋ฅผ ๋‘ ๋ฒˆ ํ†ต๊ณผํ•  ๋•Œ๋ณด๋‹ค ๋” ํšจ์œจ์ ์ธ ๊ตฌํ˜„์„ ๋ฐ”๋ž๋‹ˆ๋‹ค.
3) AngularDart์™€ ๊ฐ™์€ ํ›„์† ์›น ์•ฑ ๋˜๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ›„์† ๋ฐ์Šคํฌํ†ฑ ์•ฑ์—์„œ dart ๋ชจ๋ธ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ: https://github.com/google/flutter-desktop-embedding

์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ @eseidelGoogle์˜ 2

@mraleph๊ฐ€ ์ œ์•ˆํ•œ ๋Œ€๋กœ FFI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ์˜๊ฒฌ์—์„œ์™€ ๊ฐ™์ด 1)-3)์ด ํ—ˆ์šฉ

@CryptUser C/C++ ์ฝ”๋“œ๊ฐ€ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•œ ๊ฒฝ์šฐ FFI๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋Š” Dart ์ฝ”๋“œ๋„ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

@mraleph ์ž˜

@mraleph ์–ด๋”˜๊ฐ€์— Dart์˜ FFI์— ๋Œ€ํ•œ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@dnfield ์ง€๊ธˆ ๋ฐ”๋กœ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค https://github.com/dart-lang/sdk/issues/34452

C/C++/Rust ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ffi๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

Android ํƒœ๋ธ”๋ฆฟ(Android 4.4)์—์„œ ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
ํŽ„๋Ÿญ์ด๋Š” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰.
๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋žซํผ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” sqflite๋กœ 1000 ํ–‰์„ ์ฝ์œผ๋ ค๊ณ ํ•˜๋ฉด ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆฝ๋‹ˆ๋‹ค.
์ด์œ  : sqlite ์ปค์„œ ๋ฆฌ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ sqlite ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋™์ผํ•œ ์ฟผ๋ฆฌ๊ฐ€ ์ฆ‰์‹œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (xamarin ๋ฐ ๊ธฐ๋ณธ Android ํ”„๋กœ์ ํŠธ๋กœ ํ…Œ์ŠคํŠธ๋จ).

์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ์ด ๋ฌธ์ œ์— ๊ฐ€์žฅ ์ž˜ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ https://github.com/flutter/flutter/issues/7053#issuecomment-377711814์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด ๋ฌธ์ œ์—๋Š” ๋งŽ์€ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉฐ ์•„๋งˆ๋„ ๋ถ„ํ• ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)

๊ทธ๋Ÿฌ๋‚˜ FFI ํƒ์ƒ‰์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์ผ๋ถ€ ์—”์ง€๋‹ˆ์–ด๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค(https://github.com/flutter/flutter/issues/7053#issuecomment-415161464 ์ฐธ์กฐ). ์ง€๊ธˆ ์šฐ๋ฆฌ์˜ ์ดˆ์ ์€ 1.0์„ ์ถœ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ์™„๋ฃŒ๋˜๋ฉด ์ด๊ฒƒ์€ ๋ชฉ๋ก์—์„œ ๊ฐ€์žฅ ๋†’์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ง€์†์ ์ธ ํ”ผ๋“œ๋ฐฑ์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ณต์œ ํ•  ์ง„ํ–‰ ์ƒํ™ฉ์ด ๋” ์žˆ์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋„ Matlab/Simulink ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋œ CPU ํŠน์ • c/cpp ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ”Œ๋Ÿฌํ„ฐ์— ํ†ตํ•ฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งŽ์€ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ๊ธฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‚˜๋Š” ๋ชจ๋“  ๋‹คํŠธ ํ”Œ๋Ÿฌํ„ฐ ๊ฒฝํ—˜์„ ์žŠ์–ด๋ฒ„๋ฆฌ๊ณ  ์ž๋งˆ๋ฆฐ์ด๋‚˜ ๋‚˜์—๊ฒŒ ๋งž๋Š” ๊ฒƒ์„ ๋ฐฐ์šฐ๊ธฐ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ง„ํ–‰ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Dart์™€ C๋ฅผ ์ƒํ˜ธ ์šด์šฉํ•˜๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚œ ๊ณ ํ†ต์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋ฅผ ์„œ๋‘๋ฅธ๋‹ค๊ณ  ํ•ด์„œ ์ข‹์€ ํ’ˆ์งˆ์˜ ์ œํ’ˆ์ด ๋‚˜์˜ค์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค€๋น„๋˜๋ฉด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. :-)

ํ”„๋กœ์„ธ์Šค๋ฅผ ์„œ๋‘๋ฅธ๋‹ค๊ณ  ํ•ด์„œ ์ข‹์€ ํ’ˆ์งˆ์˜ ์ œํ’ˆ์ด ๋‚˜์˜ค์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ค€๋น„๋˜๋ฉด ์ค€๋น„๋ฉ๋‹ˆ๋‹ค. :-)

๊ธ€์Ž„, ๋‚ด๊ฐ€ ๋งํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์ž์›๊ณผ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ๋„๋ก ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋†’์ด๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "ํ–ฅํ›„ ๋ช‡ ๋…„ ๋‚ด์— ์ˆ˜์ •๋ " "๋ชฉํ‘œ"๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ํ˜„์žฌ 1386๊ฐœ์˜ ๋ฏธํ•ด๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ฝ์€ ํ›„ @eseidelGoogle์—์„œ Flutter 1.0์ด ์ค€๋น„๋œ ํ›„์— ์ด๊ฒƒ์ด ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ๊ณ ๋ฏผ์„ ์ž˜ ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

"๋ชฉํ‘œ"๊ฐ€ ์ž˜๋ชป๋œ ๋ฒ„ํ‚ท์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :) @mraleph ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ๋™์•ˆ https://github.com/dart-lang/sdk/issues/34452 ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ ์–ด๋„ ์†”๋ฃจ์…˜์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ํ˜„์žฌ Dart ์ธก์—์„œ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์ค‘์ธ FFI์— ๋Œ€ํ•œ ๋น„์ „ ๋ฌธ์„œ ์ž…๋‹ˆ๋‹ค.

์‚ดํŽด๋ณด๊ณ  ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”.

FFI ๋ถ€๋ถ„์€ ๊ทธ๋Ÿฐ๊ฑธ ์จ๋ณธ์ ์ด ์—†์–ด์„œ ๋ญ๋ผ ๋ง์„ ๋ชปํ•˜๊ฒ ๋Š”๋ฐ
ํ•˜์ง€๋งŒ ํŽ ํ†ตํ•ฉ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

FFI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ์‹œ ํŒจํ‚ค์ง€๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ?
FFI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

@zoechi ์šฐ๋ฆฌ๋Š” ์•„์ง pub ํ†ตํ•ฉ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  Flutter ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ/์•„ํ‚คํ…์ฒ˜์— ์ ํ•ฉํ•œ ์†Œ์Šค ๋ฐ/๋˜๋Š” ์†Œ๋น„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ปดํŒŒ์ผ/๋งํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

ํŽ์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ํŒจํ‚ค์ง€์— ๋” ํฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Flutter ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•˜๋ ค๋ฉด Flutter ๋„๊ตฌ ๋๋ถ€๋ถ„์— ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Android/iOS ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋” ์ง‘์ค‘ํ•˜๊ธฐ ์œ„ํ•ด pub-integration์„ dart-lang/pub ๋ฌธ์ œ๋กœ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” '๋น„์ „ ๋ฌธ์„œ'๋ฅผ ์ฝ์—ˆ๊ณ  ๋งˆ์นจ๋‚ด ์•ˆ๊ฐœ ์‚ฌ์ด๋กœ ๋ชจ์–‘์ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ๋‚˜๋Š” ํ›จ์”ฌ ๋‹ค๋ฅธ ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

์ฆ‰, Flatbuffer ๋ฅผ (์žฌ)์‚ฌ์šฉํ•˜์—ฌ

๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์€ ํ˜„์žฌ ์ŠคํŠธ๋ฆผ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Bloc, Rx)์™€๋„ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ์ ˆํ•œ ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๋ง ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœ ์ˆ˜์‹ ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์˜ค๋ž˜ ๋ณด์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ 'ํ˜ธ์ถœ ์ˆ˜์‹ ์ž ํ•ด์ œ'๋ฅผ ๊ฐ€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์šฐ๋ ค๋„ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•ด์„œ Flutter(Fuchsia) ์ƒํƒœ๊ณ„์— ๋งค๋„๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ๋˜๊ณ  Dart ์•ฑ ๋‚ด์—์„œ cpu์— ์ตœ์ ํ™”๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ค ํ˜•ํƒœ์˜ ffi์—๋„ ๋ฐ•์ˆ˜๋ฅผ ๋ณด๋‚ด๊ฒ ์Šต๋‹ˆ๋‹ค.

@ohir ๋‹น์‹ ์ด ์ƒ์ƒํ–ˆ๋˜ ๊ฒƒ์€ ๋ฒ„๊ทธ์— ๋‚˜ํƒ€๋‚œ ์ผ๋ถ€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ฒ„๊ทธ๋Š” C++์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์„ ํฌ๊ด„ํ•˜๋Š” ๋ฒ”์šฉ์œผ๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. :/ ๋‚˜๋Š” (์ด์ „ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด) ์ด ๋ฒ„๊ทธ๋ฅผ ๋” ์ž‘์€ ๊ฒƒ์œผ๋กœ ๋‚˜๋ˆŒ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. FFI ์ž‘์—…์€ ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ถ„์•ผ์—์„œ ๊ตฌ์ถ•ํ•˜๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@eseidelGoogle ์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํ˜„์žฌ dart ํŒจํ‚ค์ง€๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ffmpeg๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฑฐ์šด ๋น„๋””์˜ค ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” flutter๊ฐ€ ffmpeg lib๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€ ๊ฐ„ UI ๊ธฐ๋ฐ˜ ์•ฑ์˜ ๊ฒฝ์šฐ ์ด์ œ ํ”Œ๋Ÿฌํ„ฐ๋Š” Android์™€ ios ๋ชจ๋‘์—์„œ ์ด์ค‘ ์ฝ”๋”ฉ ์ž‘์—…์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ •๋ง ์ข‹์€ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ Flutter์˜ ์ด์ ์€ ์ด์ „ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฏธ ์ถฉ๋ถ„ํžˆ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์‚ฌ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ํšŒ์‚ฌ์—๊ฒŒ ์ˆจ์ด ๋ง‰ํž ์ •๋„๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

dart๊ฐ€ ์–ธ์  ๊ฐ€๋Š” ๊ทธ ์ž‘์—…์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ํ”Œ๋Ÿฌํ„ฐ ์ƒํƒœ๊ณ„์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ IT ํšŒ์‚ฌ์˜ ๊ด€์ ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ ํฌ๋กœ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ์ฝ”๋”ฉ ๋ฐฉ๋ฒ•์€ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋น„๋””์˜ค/์˜ค๋””์˜ค, AR ์ง์› ๋“ฑ๊ณผ ๊ฐ™์ด ์ด๋ฏธ c/c++๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•œ ์ผ๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋Š” ํ•œ ๊ฐ€์žฅ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด dart lang์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๊ฒƒ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ•ต์‹ฌ ์†”๋ฃจ์…˜์€ flutter๊ฐ€ C++์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ์ง์ ‘์ ์ด๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด๊ฒƒ์ด "ํฌ๋กœ์Šค ํ”Œ๋žซํผ"์˜ ์ตœ์šฐ์„  ์ˆœ์œ„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. UI ์ง์›์„ ์œ„ํ•œ dart๋Š” ์™„๋ฒฝํ•˜๊ณ  ์ผ๋ถ€ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋…ผ๋ฆฌ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹คํŠธ์—์„œ ์ˆ˜ํ–‰๋˜์ง€๋งŒ, ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์žฌ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ”Œ๋Ÿฌํ„ฐ๊ฐ€ ๊ธธ์ง€๋งŒ ์—ฌ์ „ํžˆ ํ™œ๋™์ ์ด๊ณ  ํšจ์œจ์ ์ธ C++ ์ƒํƒœ๊ณ„์— ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค!

์ง„์ •ํ•œ "ํฌ๋กœ์Šค ํ”Œ๋žซํผ" ์ฝ”๋”ฉ ๊ฒฝํ—˜์˜ ๊ฟˆ์€ ๋‚ด๋ถ€์— C++๊ฐ€ ์žˆ๊ณ  Java ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์—†๊ณ  OC ์ฝ”๋“œ๊ฐ€ ์ „ํ˜€ ์—†๋Š” dart UI ์ง์›์ž…๋‹ˆ๋‹ค. ์™€ํ•˜ํ•˜, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์–ด ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

@smellbee ffmpeg ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

@smellbee I featr ์ด ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. @eseidelGoogle ์ด์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@smellbee ffmpeg ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

ffmpeg lib๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋””์˜ค ํ”„๋ ˆ์ž„์„ ๋ Œ๋”๋งํ•˜์—ฌ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@smellbee I featr ์ด ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์•„๋‹™๋‹ˆ๋‹ค. @eseidelGoogle ์ด์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "es"๋ฅผ ์ž…๋ ฅํ–ˆ๊ณ  ์ž๋™์œผ๋กœ ์™„๋ฃŒ ๋˜์—ˆ์ง€๋งŒ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์€ Dart ์ชฝ์—์„œ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2019๋…„ 1๋ถ„๊ธฐ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ค€๋น„ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํฐ ๊ธฐ๋Šฅ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Dart์˜ ๋‹ค์–‘ํ•œ ์‹คํ–‰ ๋ชจ๋“œ์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฏ€๋กœ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ ค์ฃผ์‹ญ์‹œ์˜ค.

Dart ์ธก์—์„œ ์ž‘์—…์„ ์ถ”์ ํ•˜๋Š” dart-lang/sdk#34452๋ฅผ ๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dart FFI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Dart์—์„œ C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ C++ ๊ธฐ๋Šฅ(ํด๋ž˜์Šค, ํ‘œ์ค€ ์ปจํ…Œ์ด๋„ˆ, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ, ์˜ˆ์™ธ)์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
์ตœ์†Œํ•œ์˜ ์ƒ์šฉ๊ตฌ๋กœ C++ ํด๋ž˜์Šค๋ฅผ Dart๋กœ ๋‚ด๋ณด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ์ง€์›์ž…๋‹ˆ๋‹ค. C++ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๋ฉ”์„œ๋“œ์—์„œ Future/Stream์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

@t-artikov C++ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์ง์ ‘ ์ง€์›ํ•  ๊ณ„ํš์€ ํ˜„์žฌ ์—†์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. C++์™€ ์ธ์ฒด๊ณตํ•™์ ์œผ๋กœ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ C++์ž…๋‹ˆ๋‹ค.

C++์™€์˜ ๋†’์€ ์ˆ˜์ค€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด C์™€ ๊ฐ™์€ API๋ฅผ ํ†ตํ•ด C++ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ณ ์œ ํ•œ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๊ณ„์ธต์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ์ง€์›์ž…๋‹ˆ๋‹ค. C++ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๋ฉ”์„œ๋“œ์—์„œ Future/Stream์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ๊ตฌ์ถ•๋  ์ˆ˜ ์žˆ๋„๋ก ์˜ฌ๋ฐ”๋ฅธ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Dart FFI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Dart์—์„œ C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ C++ ๊ธฐ๋Šฅ(ํด๋ž˜์Šค, ํ‘œ์ค€ ์ปจํ…Œ์ด๋„ˆ, ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ, ์˜ˆ์™ธ)์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
์ตœ์†Œํ•œ์˜ ์ƒ์šฉ๊ตฌ๋กœ C++ ํด๋ž˜์Šค๋ฅผ Dart๋กœ ๋‚ด๋ณด๋‚ผ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

C++์—์„œ dart๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ํ•œ, ๊ทธ๋Ÿฐ ์ผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. C++๋Š” C++๊ฐ€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜์—ฌ dart์™€ ํ†ต์‹ ํ•˜๋ฏ€๋กœ ์ €์ˆ˜์ค€ ์กฐ์ž‘์„ ๋…ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹คํŠธ์˜ ์‚ฌ์šฉ ํŽธ์˜์„ฑ์„ ํŒŒ๊ดดํ•˜๋Š” ๋‹คํŠธ.

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ ๋น„๋™๊ธฐ ์ง€์›์ž…๋‹ˆ๋‹ค. C++ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ๋ฉ”์„œ๋“œ์—์„œ Future/Stream์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  dart๋Š” ์ด๋ฏธ ๋น„๋™๊ธฐ์‹ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ C++ ๋ถ€๋ถ„์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค dart๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  "๊ฒฉ๋ฆฌ"๊ฐ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ C++ ์ง€ํ–ฅ์ ์ธ์ง€ ์—ฌ๋ถ€๋Š” ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค @mraleph , ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ €๋ฅผ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค ;)

@mraleph
์‚ฌ์‹ค, ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ํ›Œ๋ฅญํ•œ C++ ์ƒํ˜ธ ์šด์šฉ์„ฑ์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/boostorg/python
https://github.com/ThePhD/sol2
https://github.com/dropbox/djinni
Dart/Flutter๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

C++์™€์˜ ๋†’์€ ์ˆ˜์ค€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด C์™€ ๊ฐ™์€ API๋ฅผ ํ†ตํ•ด C++ API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ณ ์œ ํ•œ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๊ณ„์ธต์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ะก++ ํด๋ž˜์Šค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด์—ฌ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

struct MyObject
{
    std::string name;
    std::vector<int> data;
};

class MyService
{
    // Can throw std::exception
    std::shared_ptr<MyObject> createObject(std::string name, std::vector<int> data);
};

Dart์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก

var service = MyService();
var object = service.createObject("foo", [1, 2, 3]);
assert(object.name == "foo");
assert(object.data[0] == 1);

@t-artikov boostorg::python ๋ฐ sol2 ๋‘˜ ๋‹ค ์‹ค์ œ๋กœ ๋‚ด ์š”์ ์„ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์ƒํ˜ธ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•œ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€ ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Dart FFI๋Š” Dart๋ฅผ ํ˜ธ์ถœํ•˜๋Š” C++ ์ค‘์‹ฌ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ C API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Dart ์ค‘์‹ฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ะก++ ํด๋ž˜์Šค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด์—ฌ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์™€ ๊ฐ™์ด ์ž‘์„ฑ(๋˜๋Š” ์ผ๋ถ€ ๋„๊ตฌ๋กœ ์ƒ์„ฑ)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

// To be compiled together with your code.
typedef std::shared_ptr<MyObject>* MyObjectPtr;

MyService* MyService_create() {
  return new MyService();
}

void MyService_destroy(MyService* ptr) {
  delete ptr;
}

MyObjectPtr MyService_createObject(MyService* ptr, const char* name, int* data, size_t size) {
  try {
    return new std::shared_ptr<MyObject>(createObject());
  } catch (...) {
    return nullptr;
  }
}

const char* MyObject_getName(MyObjectPtr obj) {
  return (*obj)->name.c_str();
}

int* MyObject_data(MyObjectPtr obj) {
  return (*obj)->data.data();
} 

void MyObject_destroy(MyObjectPtr obj) {
  delete obj;
}
// To be included on the Dart side.
@ffi.External()
external Pointer<Void> MyService_create();
@ffi.External()
external void MyService_destroy(Pointer<Void> ptr);
@ffi.External<Pointer<Void> Function(Pointer<Void>, Pointer<Void>, Pointer<Void>, Int32)>()
external Pointer<Void> MyService_createObject(Pointer<Void> service, String name, Int32List data, int size);
@ffi.External()
external String MyObject_getName(Pointer<Void> obj);
@ffi.External()
external Pointer<Int32> MyObject_data(Pointer<Void> obj);
@ffi.External()
external void MyObject_destroy(Pointer<Void> ptr);

class MyService {
  final Pointer<Void> _impl;
  MyService() : _impl = ffi.anchor(MyService_create(), MyService_destroy);

  MyObject create(String name, List<int> values) {
    final Int32List data = Int32List.fromList(values);
    return MyObject._(MyService_createObject(_impl, name, data, data.length));
  }

  static _destroy(Pointer<Void> ptr) {
    return MyService_destroy(ptr);
  }
}

class MyObject {
  final Pointer<Void> _impl;

  MyObject._(Pointer<Void> impl) : _impl = anchor(impl, MyObject.destroy);

  String get name => MyObject_getName(_impl);
  Int32List data => MyObject_data(_impl).as<Int32List>();

  static void destroy(Pointer<Void> ptr) { MyObject_destroy(ptr); }
}

์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์ƒํ˜ธ ์šด์šฉํ•˜๊ธฐ ์œ„ํ•œ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€ ๊ทธ ๋ฐ˜๋Œ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ C++ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋…ธ์ถœํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
https://www.boost.org/doc/libs/1_68_0/libs/python/doc/html/tutorial/tutorial/exposing.html

Dart FFI ์˜ˆ์ œ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
๋ช‡ ๊ฐ€์ง€ ๊ฒฐํ•จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. C++ ์˜ˆ์™ธ๋Š” Dart ์ธก์— ์ „๋‹ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. MyObject.data๋Š” ์ด ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํฌ์ธํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋Š” ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Œ).
๊ทธ๋Ÿฌ๋‚˜ ์•„์ด๋””์–ด๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์— ๊ทธ๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค.
์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒˆ๋กœ์šด Dart FFI Flutter Engine ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์ž๋™ํ™”๋ ์ง€ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.

C++ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„ ๋ฐ”์ธ๋”ฉ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค(์ œ๋„ค๋ฆญ, ๋‹ค์ค‘ ์ƒ์†, ์—ฐ์‚ฐ์ž ์˜ค๋ฒ„๋กœ๋“œ, ๋งน๊ธ€๋ง๋œ ์ด๋ฆ„ ๋“ฑ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?). ๋งŽ์€ ํž˜๋“  ์‹œ๋„(BridJ, CppSharp ๋“ฑ)๊ฐ€ ์žˆ์—ˆ๊ณ  ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์‚ฌ๋žŒ๋“ค์€ C interop์ด ๊ฐ€์žฅ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์ƒํ˜ธ ์šด์šฉ์„ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ C++์— ๋Œ€ํ•ด ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. Kotlin/Native๋Š” ์ด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์Šค์นผ๋ผ ๋„ค์ดํ‹ฐ๋ธŒ iether. .NET(Microsoft C++ interop์€ ํ•ญ์ƒ ์ด์ƒํ•˜๊ฑฐ๋‚˜ ์ •์ ์ž„). JNI๋Š” ์ •์  ์ปดํŒŒ์ผ์ด ๊ด€๋ จ๋œ ๊ฒฝ์šฐ์—๋งŒ C++ interop์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ๋ถ€์ŠคํŠธ ๊ธ€๋ฃจ์™€ ๊ฐ™์€ ๊ฒƒ์€ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ3์ž ๊ทธ๋ฃน์€ JNAerator์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๋‹ต๋ณ€์ด ์—†๋Š” ์ด ๋Œ€ํ™”์— ์ด์–ด ์ €๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด๊ณ  ์™„์ „ํ•œ C++ ์ง€์›์„ ์ œ๊ณตํ•˜๋Š” Qt๋ฅผ ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์— Flutter๋ฅผ ์‹œ๋„ํ•ด ๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

flutter๊ฐ€ C++๋กœ ์ž‘์„ฑ๋˜์–ด ๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์ƒํ˜ธ ์šด์šฉ์ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ–ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C++์—์„œ flutter๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ง€๊ธˆ ๋…ผ์˜๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ™•๋Œ€๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” Flutter์˜ ๊ฐœ๋ฐœ ๋กœ๋“œ๋งต์— ๋ฌด์—‡์ด ์žˆ๋Š”์ง€(๋˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€์ง€) ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์‚ฌ์šฉ(๋˜๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์˜์ œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์•„๋ฌด๋Ÿฐ ๋„์›€์ด ๋˜์ง€ ์•Š๊ฑฐ๋‚˜
์ด ์ง€์ ์„ ๋„˜์–ด์„œ๋Š” ํŠน์ • ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”,
๊ฐ€์šฐ๋ผํ”„

2019๋…„ 2์›” 25์ผ ์›”์š”์ผ ์˜คํ›„ 10์‹œ 51๋ถ„ bhauj, ์•Œ๋ฆผ @github.com์ด(๊ฐ€) ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

flutter๊ฐ€ C++๋กœ ์ž‘์„ฑ๋˜์—ˆ๋”๋ผ๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์ƒํ˜ธ ์šด์šฉ์„ฑ์ด ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ~์ด๋‹ค
C++์—์„œ flutter๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/flutter/flutter/issues/7053#issuecomment-467098455 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AZ86acDpZgNeyezx40uxe_c5E2xZHWxaks5vRBumgaJpZM4K-PLw
.

์‹ค์ œ๋กœ Flutter๋Š” C++๋กœ ์ž‘์„ฑ๋œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Flutter ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ VM์—์„œ ์‹คํ–‰๋˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ Language Dart๋กœ๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง Dart์—์„œ Flutter์˜ C++ ๋ถ€๋ถ„์œผ๋กœ ์ด๋™ํ•  ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค...

๋”ฐ๋ผ์„œ ์ด ๊ธ€์„ ์ฝ๊ณ  ์ข‹์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ ์•ฑ ๊ฐœ๋ฐœ์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด Flutter์—์„œ C++๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ Qt C++์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๋‚˜์—๊ฒŒ C++๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ์ˆ ์—์„œ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ณตํ†ต ๋ถ„๋ชจ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ ๊ฐ„ ๊ฐœ๋ฐœ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

@aqmappdesigners

VM์—์„œ ์‹คํ–‰๋˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ Language Dart

์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Flutter๋Š” ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ Dart VM์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ซ ๋ฆฌ๋กœ๋“œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋ฆด๋ฆฌ์Šค ๋นŒ๋“œ์—์„œ Dart๋Š” C++์™€ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

@zoechi ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์— ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

์„ฑ๋Šฅ์— ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

Apples App Store์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.

dart:ffi ํ”„๋กœํ† ํƒ€์ž…์€ API ๊ฒฐ์ •์„ ๊ฒฐ์ •ํ•˜๋Š” ์ง€์ ๊นŒ์ง€ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (์ผ๋ถ€ ๋””์ž์ธ ๊ฒฐ์ •์€ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜

์ •๋ณด์— ์ž…๊ฐํ•œ ๋””์ž์ธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋Š” C API์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์˜ˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด ๋ฌธ์ œ์—์„œ๋Š” SQLite, Realm, OpenCV, Superpowered ๋ฐ ffmpeg์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•ด์•ผ ํ•  ๋‹ค๋ฅธ API๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@dcharkes ๋„์›€์ด๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Android์˜ Telegram์€ JNI๋ฅผ ํ†ตํ•ด C++์—์„œ ๋„คํŠธ์›Œํ‚น์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/jni/TgNetWrapper.cpp
๋˜ํ•œ ffmpeg๋กœ GIF ์žฌ์ƒ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ Android Bitmaps์— ์ง์ ‘ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
https://github.com/DrKLO/Telegram/blob/master/TMessagesProj/jni/gifvideo.cpp

๋“ฑ๋ก ์–‘์‹์— ๋Œ€ํ•ด libphonenumber ๋ฐ libpostal ์„ ํ†ตํ•ด ์ „ํ™” ๋ฐ ์ฃผ์†Œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ glfw + flutter- embedder ๊ทธ๋ฆฌ๊ณ  ์–ธ์  ๊ฐ€๋Š” ์™„์ „ํžˆ ๋‹คํŠธ๋กœ ์ž‘์„ฑ๋œ ๋ฐ์Šคํฌํƒ‘ ์•ฑ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

SQLite ๋ฐ Realm์˜ ๊ฒฝ์šฐ +1. Couchbase ๋„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค. C SDK์™€ ํ•จ๊ป˜ ๊ณตํ†ต C++ ์ฝ”์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Firebase C++ API๊ฐ€ ์žฌ๋ฏธ์žˆ์„๊นŒ์š”? https://firebase.google.com/docs/reference/cpp/

์ž์„ธํžˆ ์‚ดํŽด๋ณด์ง„ ์•Š์•˜์ง€๋งŒ iOS ๋ฐ Android ํ”Œ๋Ÿฌ๊ทธ์ธ์„ C++์™€ ์ง์ ‘ ๋Œ€ํ™”ํ•˜๋Š” ๋‹จ์ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ring from rust - https://github.com/briansmith/ring ๊ณผ ๊ฐ™์€ ์‚ฌ๋ž‘์„ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

OpenCV, Realm, SqlCipher์˜ ๊ฒฝ์šฐ +1(https://github.com/sqlcipher/sqlcipher)

์•”ํ˜ธํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ํŠนํžˆ libsodium ๋˜๋Š” ํŒ…ํฌ.

https://github.com/google/tink

https://libsodium.gitbook.io/doc/

์ด๋ฏธ flutter-sodium ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ ํ”Œ๋žซํผ ์ฑ„๋„์„ ํ†ตํ•ด ๊ฐ ํ”Œ๋žซํผ์˜ libsodium ๋ž˜ํผ์™€ ํ†ต์‹ ํ•œ ๋‹ค์Œ ๊ธฐ๋ณธ์œผ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

mapbox-gl https://github.com/mapbox/mapbox-gl-native ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ง€์ • ๋งคํ•‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

https://github.com/deltachat/deltachat-core ๋ฅผ ํ†ตํ•œ Flutter์˜ SMTP/IMAP ์ฒ˜๋ฆฌ(์ด๋ฉ”์ผ ์ฑ„ํŒ…์šฉ)๋Š” ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋„ˆ๋ฌด ๊ณผ๊ฐํ•˜๊ฒŒ ๋ฐ”๊ฟ” ๋งํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง์€ ์˜ค๋””์˜ค/๋น„๋””์˜ค ํ•˜๋“œ์›จ์–ด ์•ก์„ธ์Šค(์˜ˆ: Superpowered)
  2. ํ•˜๋“œ์›จ์–ด ์ง€์› A/V ์ฒ˜๋ฆฌ(์˜ˆ: ffmpeg)
  3. XMPP/๊ธฐํƒ€ ๋„คํŠธ์›Œํฌ ์ง€ํ–ฅ ํ”„๋กœํ† ์ฝœ์šฉ TCP ๊ธฐ๋ฐ˜ ์†Œ์ผ“ ์•ก์„ธ์Šค
    (์ฑ„ํŒ…, ํ‘ธ์‹œ ์•Œ๋ฆผ์šฉ)
  4. ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€ ์—…๊ทธ๋ ˆ์ด๋“œ(๋ฃจํŠธ ์•ก์„ธ์Šค) / ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
    ํ”Œ๋žซํผ ๊ฐ„ ํ˜ธํ™˜ ๋ฐฉ์‹(์‹œ์Šคํ…œ ์•ฑ, ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น, ์—๋ฎฌ๋ ˆ์ดํ„ฐ์šฉ)

๋” ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ๋“ค์€ ๋‚ด
์ •์‹ .

์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋งค์šฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

@skills-up ์šฐ๋ฆฌ๋Š” ์ถ”์ƒ์ ์ธ ๋ถ„๋ฅ˜๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ์— โ€‹โ€‹ํ›จ์”ฌ ๋” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด FFI์˜ ์ธ์ฒด ๊ณตํ•™์„ ํ‰๊ฐ€ํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด์ƒํ•˜๊ฒŒ๋„ C++์—์„œ/๋กœ ์ตœ๊ณ ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜๋Š” OO์— ๋Œ€ํ•ด ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋งคํฌ๋กœ + ๋นŒ๋“œ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด Rust์ž…๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ˆ„ ์š”์ฒญ๊ณผ xml ํŒŒ์ผ(XMLDSig, Xades l)์— ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— OpenSSL์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
Dart ์ž์ฒด์—๋Š” BoringSSL์ด ์žˆ์ง€๋งŒ ๊ทธ ์ค‘ ์ผ๋ถ€๋งŒ Dart๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐจ์„ ์ฑ…์€ ํ”Œ๋Ÿฌํ„ฐ์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ openssl ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ŠคํŒธ์ด ์•„๋‹ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ JNI๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  tensorflow lite์™€ ๋” ์ž˜ ํ†ตํ•ฉ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋น„๋””์˜ค ์ž‘์—…์— ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž์„ธํžˆ ์‚ดํŽด๋ณด์ง„ ์•Š์•˜์ง€๋งŒ iOS ๋ฐ Android ํ”Œ๋Ÿฌ๊ทธ์ธ์„ > C++์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๋‹จ์ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

C++๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ Go์™€ ์ง์ ‘ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” UI ์‘๋‹ต ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” gomobile ๋ฐ flutter ํ”Œ๋žซํผ ์ฑ„๋„์„ ํ†ตํ•ด Go์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Flutter์—์„œ Go ๋ฐ C++๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๊ท ์ผํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜(๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ/์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ก์„ธ์Šค์˜ ๊ฒฝ์šฐ +1์ž…๋‹ˆ๋‹ค.

Android/iOS์šฉ ํ”Œ๋žซํผ ์ฑ„๋„์„ ๋งŒ๋“ค๊ณ  ๋‘ ๊ฐœ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ ๋„ Vulkan/MoltenVK์— ์•ก์„ธ์Šคํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Dart์—์„œ๋งŒ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ 3D ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๊ณ  ํ…์Šค์ฒ˜ ์œ„์ ฏ์œผ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ์ฑ„๋„์€ ํ•ดํ‚ค ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜๊ณ  ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ƒˆ ๋ฒ„์ „์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
์ด ๊ธฐ๋Šฅ์€ ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ์–ด๋“ค์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, plz๋Š” flutter์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.
Flutter์—์„œ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์˜ˆ, plz๋Š” flutter์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.
Flutter์—์„œ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์กฐ๊ธฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ ์€ Dart ์ถ”์  ๋ฒ„๊ทธ ์—…๋ฐ์ดํŠธ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@mit-mit ์ด๊ฒƒ์ด ์ด ๋ฌธ์ œ์— ๋„์›€์ด ๋ ๊นŒ์š”? Flutter์™€ ํ•จ๊ป˜ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŒŒํ‹ฐ์— ๋Šฆ์—ˆ์ง€๋งŒ SQLCipher @dcharkes @mraleph์˜ ๊ฒฝ์šฐ +1

@doc-rj ์šฐ๋ฆฌ๋Š” ์ด์ œ SQLCipher ๋ฐ”์ธ๋”ฉ์„ ์‹คํ—˜ํ•˜๊ณ  ๊ฒฝํ—˜์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋‹จ๊ณ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์š”์ฒญ์ด ๋งค์šฐ ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๊ณผ ๋ˆ„๊ตฌ๋‚˜ C API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐํ”Œ๋žซํผ์ด ๋ฐœํ‘œ๋˜๋ฉด์„œ ๊ทธ ํ•„์š”์„ฑ์ด ๋†’์•„์ง„ ๊ฒƒ ๊ฐ™์•„์š”.

์ด๊ฒƒ์€ ๋กœ๋“œ๋งต์˜ ์ผ๋ถ€์ž…๋‹ˆ๊นŒ?

@felemedeiros ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. FFI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ธ๋”ฉ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ •๋ณด๋Š” ์ด ๋Œ“๊ธ€ ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ž์„ธํžˆ ์‚ดํŽด๋ณด์ง„ ์•Š์•˜์ง€๋งŒ iOS ๋ฐ Android ํ”Œ๋Ÿฌ๊ทธ์ธ์„ > C++์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๋‹จ์ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

C++๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ Go์™€ ์ง์ ‘ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” UI ์‘๋‹ต ์†๋„๋ฅผ ๋Šฆ์ถ”๋Š” gomobile ๋ฐ flutter ํ”Œ๋žซํผ ์ฑ„๋„์„ ํ†ตํ•ด Go์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Flutter์—์„œ Go ๋ฐ C++๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ๊ท ์ผํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜(๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ/์•Œ๊ณ ๋ฆฌ์ฆ˜)์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ Flutter์—์„œ Go ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://medium.com/@archan.paul/using -go-library-in-flutter-a04e3496aa05

Flutter ์•ฑ์— C++ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Flutter ์•ฑ์— C++ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

ํ˜„์žฌ๋กœ์„œ๋Š” C++ -> JNI(Android์šฉ) -> PlatformChannel ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์šฐ์•„ํ•œ ๋ฐฉ๋ฒ•์ด ๋  ๋•Œ๊นŒ์ง€ ์„ ํƒํ•˜๋Š” ๊ฒƒ๋ฟ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!!

ezored(http://ezored.com)๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ Java ๋ฐ objc์— ์žˆ์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ณ€ํ™˜ํ•  ํ•„์š” ์—†์ด ๋ณต์žกํ•œ ๊ฐ์ฒด๋ฅผ Flutter์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ezored๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SDK๋ฅผ ์ƒ์„ฑ(๋˜๋Š” ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋‹ค์šด๋กœ๋“œ)ํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ์™€ Dart ๊ฐ„์˜ Flutter ํ†ตํ•ฉ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ, ๊ตฌ๋ฌธ ๋ถ„์„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ crud ๋ฐ ์ด๋ฏธ ๊ตฌํ˜„๋œ ๋ฐ๋ชจ SDK์˜ ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Flutter ๊ทธ๋ฃน์—์„œ ๊ฒ€์ƒ‰ํ•˜์ง€๋งŒ ๊ฐœ์ฒด์™€ ๊ฐœ์ฒด ๋ชฉ๋ก์„ Flutter์— ์ง์ ‘ ์ „๋‹ฌํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? 2.5๋…„์€ ๋„˜๊ฒŒ ํ˜๋ €๋˜ ๊ฒƒ ๊ฐ™๋‹ค...

@fzyzcjy ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ดˆ๊ธฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฐธ์—ฌ ๋ฐฉ๋ฒ•์€ https://github.com/dart-lang/sdk/issues/34452#issuecomment -482136759๋ฅผ ์ฐธ์กฐ

์ด ์ดˆ๊ธฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ดํ›„๋กœ Intel 32, Arm 64 ๋ฐ Arm 32์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋žซํผ์€ ์•„์ง ์•ˆ์ • ๋ฒ„์ „์ด๋‚˜ ๊ฐœ๋ฐœ ๋ฒ„์ „์œผ๋กœ ์ถœ์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ Dart sdk์˜ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ณ 

@dcharke ๊ทธ ์†Œ์‹์„

์–ด๋–ค ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฐ ์ถ”๊ฐ€ ์ •๋ณด๋Š” https://github.com/dart-lang/sdk/issues/34452 ๋ฅผ ์ฐธ์กฐ

Flutter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ac ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ffi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Flutter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ac ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ffi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์žฅ๊ธฐ์ ์œผ๋กœ WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@ with-with ์ •๋ง?

Flutter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์•ฑ์„ ๋งŒ๋“ค ๋•Œ ac ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ•จ๊ป˜ ffi๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ์žฅ๊ธฐ์ ์œผ๋กœ WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

WebAssembly๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฏธ๋ž˜์— WebAssembly๋กœ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ง€๊ธˆ ASM.js๋กœ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nic-hartley ์ข‹์€ ์ƒ๊ฐ์ด์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋ผ Dart(JS๋กœ ์ปดํŒŒ์ผ๋œ)์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜•์‹์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ FFI๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ด๋ฉฐ asm.js ๋˜๋Š” WebAssembly๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆ ํ•˜์ž๋ฉด, ์šฐ๋ฆฌ์˜ ๊ตฌํ˜„์ด ๋งค์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ™•์‹คํžˆ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ œ๊ณตํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

flutter๋Š” C++๋ฅผ ์ง€์›ํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์žฅ๋‚œ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

Flutter๊ฐ€ C++์™€ ์‰ฝ๊ฒŒ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€(๋ธŒ๋ฆฌ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด) ๊ธฐ์กด ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํˆฌ์ž๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์ ˆ๋Œ€ ์ฑ„ํƒ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋™์ผํ•œ ์š”์ ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋˜ํ’€์ดํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์™”์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋†’์€ ์šฐ์„  ์ˆœ์œ„์ž…๋‹ˆ๋‹ค.

React Native๋„ ํ˜„์žฌ ๋ธŒ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ FFI๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์ธก๋ฉด์—์„œ Flutter๊ฐ€ ์‹ค์ œ๋กœ ์•ž์„œ ๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

C++์™€์˜ ํ†ตํ•ฉ์€ AppKit์„ ์‚ฌ์šฉํ•˜๋Š” iOS์—์„œ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด React Native๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๊ฐ€ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

UWP ๋ฐ C++๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "๋‹คํŠธ FFI ๋…ธ๋ ฅ ์ง€์›" ํŒŒํ‹ฐ์—๋„ ๋™์˜ํ•˜์ง€๋งŒ...

Xamarin์€ UWP๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ๋น„๊ต์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Xamarin์˜ ๊ต์ฐจ ํ”Œ๋žซํผ ๋ณด๊ธฐ๋Š” Flutter๋งŒํผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ์ข…์ข… ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋ณด๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. Flutter์™€ ๋‹ฌ๋ฆฌ Xamarin์—๋Š” ๊ธฐ๋ณธ API(์˜ˆ: Xamarin.iOS ๋ฐ Xamarin.Android)์— ๋Œ€ํ•œ ํ”Œ๋žซํผ ๋ฐ”์ธ๋”ฉ์ด ์žˆ์œผ๋ฉฐ ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” ์ž์ฒด ์–ธ์–ด(C#/.NET)๋กœ ํ”Œ๋žซํผ๋ณ„ ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ UI ์œ„์ ฏ API ๋””์ž์ธ๊ณผ ํ˜ผํ•ฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ API ์‚ฌ์šฉ์€ ๋งŽ์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ํ˜ธ์ถœ์€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Flutter๋Š” ๊ฐ™์€ ๋ฐฐ์— ์žˆ์Šต๋‹ˆ๋‹ค(Xamarin์€ ์•ฑ ์ฝ”๋“œ์— ๋ฆฌํ”Œ๋ ‰์…˜ ํ•ดํ‚น ์—†์ด Java ๋˜๋Š” ObjC๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ). ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์˜ ๊ฒฝ์šฐ Xamarin.Android ์ž์ฒด(๋ฐฑ์—”๋“œ ํ”Œ๋žซํผ ๋ฐฑ์—”๋“œ ์ค‘ ํ•˜๋‚˜)์—์„œ๋„ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์˜ ์‚ฌ์šฉ์€ ๊ฑฐ์˜ ์—†์œผ๋ฉฐ ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  React Native๋‚˜ Xamarin๊ณผ ๋‹ฌ๋ฆฌ Flutter๋Š” ์™„์ „ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ „์ฒด Flutter ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ AppKit๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์€ ์ „์ ์œผ๋กœ ๊ณต์ •ํ•œ ๊ด€์ ์ž…๋‹ˆ๋‹ค.

์•„๋ฌด๋„ C++ ํ†ตํ•ฉ์— ๊ด€ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์•ž์„œ ์žˆ๋Š” Qt ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ์–ธ๊ธ‰์กฐ์ฐจ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

QT๋Š” C++์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ถˆ๋ฆฌํ•œ ๋ผ์ด์„ผ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

2019๋…„ 8์›” 12์ผ ์›”์š”์ผ, 06:41 Vladyslav Stelmakhovskyi, <
[email protected]>์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ํ›จ์”ฌ ์•ž์„œ์žˆ๋Š” Qt ํ”„๋ ˆ์ž„ ์›Œํฌ์— ๋Œ€ํ•ด ์–ธ๊ธ‰์กฐ์ฐจํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.
C++ ํ†ตํ•ฉ์— ๊ด€ํ•œ ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/flutter/flutter/issues/7053?email_source=notifications&email_token=AGDYMWXHTJUBUW64LEOO27TQEDSWNA5CNFSM4CXY6LYKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNNMVXH
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AGDYMWTNMTM7QUOY2BEIPM3QEDSWNANCNFSM4CXY6LYA
.

Qt๋Š” C++ ๋ฐ QML(JS ์—”์ง„)์ž…๋‹ˆ๋‹ค.
๋ฌด์Šจ ๋ผ์ด์„ผ์Šค? LGPL? GPL? ๋ญ๊ฐ€ ๋ฌธ์ œ์•ผ?

๋จผ์ € IANAL์ด์ง€๋งŒ ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Qt์˜ ๋Œ€๋ถ€๋ถ„์€ LGPL(IDE ๋“ฑ์€ GPL์ž„)์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ •์  ๋งํฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ธˆ์ง€ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ๋ผ์ด์„ ์Šค๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์šด ์–ธ์–ด๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต๊ฐœ ์†Œ์Šค์ž…๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ LGPL๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋‹ค์‹œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์ฒด ํŒŒ์ผ(๋ฐ ์•„๋งˆ๋„ ์ง€์นจ)์„ ์ œ๊ณตํ•˜๋ฉด LGPL์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Qt Company๊ฐ€ ๊ทธ ์‚ฌ์‹ค์„ ๊ด‘๊ณ ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์€ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๊ณผ๋„ํ•œ ๋ผ์ด์„ ์Šค ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š๊ณ ๋Š” ์•ฑ ์Šคํ† ์–ด์— ์•ฑ์„ ์ถœ์‹œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ์ฒด ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด์ด๋ฉฐ, ์–ด๋–ค ํšŒ์‚ฌ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Android๋Š” LGPL์—์„œ ๋” ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ๋™์ ์œผ๋กœ ๋กœ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @cpboyd๋‹˜ , ์ €๋Š” ์ด๊ฒƒ์„ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์—์„œ ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ”Œ๋žซํผ๋ณ„ UI ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ตฌ์ถ•๋œ ์•ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ ํ”Œ๋žซํผ์—์„œ ๊ธฐ์กด C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฐฉ๋Œ€ํ•œ ์ปฌ๋ ‰์…˜์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Flutter๊ฐ€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด๋ผ๋Š” ๊ฒƒ์€ ์ดํ•ดํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด(๊ธฐ์กด ์ฝ”๋“œ์™€ ํ•จ๊ป˜) ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด ์•„๋‹Œ UI๋ฅผ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๋ฏธ๋ž˜์˜ OS(์˜ˆ: Fuchsia)๊ฐ€ Flutter & Dart์˜ ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜์ง€๋งŒ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ํฐ ์‚ฌ๋žŒ์€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Flutter/Dart๊ฐ€ "์›น" ์•ฑ(์ฆ‰, ๋ฐฑ์—”๋“œ๊ฐ€ ์›น์— ์žˆ๋Š” ๊ณณ)์„ ์—ผ๋‘์— ๋‘๊ณ  ์„ค๊ณ„๋˜๊ณ  ์žˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์ „๋ฌธ ๋ฐ์Šคํฌํ†ฑ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์ž์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ์ด์™€ ๊ฐ™์€ ๊ฒฐ์ •์€ ์•ฑ ์Šคํ† ์–ด์— ์žˆ๋Š” ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ˆ˜์™€ ํ’ˆ์งˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ UIKit์„ ์‚ฌ์šฉํ•˜์—ฌ iOS์šฉ ๊ณ ํ’ˆ์งˆ ์ „๋ฌธ ์•ฑ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Fuchsia/Flutter/Dart์šฉ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์„ฑ๋Šฅ ๋น„์šฉ์ด ๊ฑฐ์˜ 0์— ๊ฐ€๊นŒ์›€). ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์„ OS ๋ฐ ํ”Œ๋žซํผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชฉ์ ์€ Flutter๋ฅผ ๋‹ค๋ฅธ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋˜๋Š” ๋น„ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ฐ•์กฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Dart FFI๋Š” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. sqllite ์˜ˆ์ œ์˜ _very_ ๊ฐ„๋žตํ•œ ์ฝ๊ธฐ์—์„œ PInvoke๊ฐ€ ์žˆ๋Š” C#๊ณผ ์œ ์‚ฌํ•ด ๋ณด์ด์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์œ ํ˜•์— ๋ž˜ํ•‘์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— C++์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. C++๋ฅผ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•œ ์™„์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•์ด ์—†๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์‹œ์Šคํ…œ. ๋‹ค์Œ Obj-C ํด๋ž˜์Šค์˜ ์šฉ์ด์„ฑ๊ณผ ๋น„๊ตํ•  ๋•Œ ๋‘˜ ๋‹ค ํŠนํžˆ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

#include <mylib/mytype.h>
<strong i="11">@implementation</strong> MyView
{
    MyLib::MyType *_pMyType;
}
<strong i="12">@end</strong>

๋˜๋Š” C++/WinRT๋ฅผ ์‚ฌ์šฉํ•˜๋Š” UWP:

#include <mylib/mytype.h>
class MyUserControl : public UserControl
{
    MyLib::MyType *_pMyType;
};

๊ฐ์‚ฌ ํ•ด์š” :-)

@Hixie @MarkIngramUK ๋‘˜ ๋‹ค ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด
AppKit์€ Apple ์ „์šฉ์ด๊ณ  UWP๋Š” Windows ์ „์šฉ์ž…๋‹ˆ๋‹ค.
์•„๋งˆ๋„ Flutter๊ฐ€ Dart ๋Œ€์‹  Swift ๋˜๋Š” C#์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ด๋ฏธ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ์ง€์›์„ ๋ฐ›์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค.
Xamarin์€ UWP๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ๋น„๊ต์ผ ์ˆ˜ ์žˆ์ง€๋งŒ Xamarin์˜ ๊ต์ฐจ ํ”Œ๋žซํผ ๋ณด๊ธฐ๋Š” Flutter๋งŒํผ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ์ข…์ข… ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋ณด๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ œ ์ œ์•ˆ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. C++์™€ ํ•จ๊ป˜ Flutter๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Dart ํŒ€์˜ FFI ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์— ์ฐธ์—ฌํ•˜๊ณ  ์šฐ๋ฆฌ ๋ชจ๋‘์— ๋Œ€ํ•œ ์ง€์›์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜ƒ

์ด ๋ฌธ์ œ๋Š” ์–ธ์–ด ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ UI ์œ„์ ฏ API ๋””์ž์ธ๊ณผ ํ˜ผํ•ฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

@atsushieno ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ† ๋ก ์ด Dart FFI ํฌ๋Ÿผ์—์„œ ๋” ์ƒ์‚ฐ์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค... Flutter๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ๋‹คํŠธ๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ Obj-C ํด๋ž˜์Šค์˜ ์šฉ์ด์„ฑ๊ณผ ๋น„๊ตํ•  ๋•Œ ๋‘˜ ๋‹ค ํŠนํžˆ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@MarkIngramUK ์ด๊ฒƒ์ด Dart ํŒ€์ด https://groups.google.com/forum/#!forum/dart -ffi์—์„œ ๋ณด๊ณ  ์‹ถ์–ดํ•˜๋Š” ํ”ผ๋“œ๋ฐฑ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

C++์˜ SDK ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ C++ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ”„๋กœ์ ํŠธ์ธ ezored(https://ezored.com)๋ผ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ํ”„๋กœ์ ํŠธ(Android ๋ฐ iOS)์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. FFI๊ฐ€ ์™„๋ฃŒ๋˜์–ด ๊ธฐ๋ณธ SDK๋ฅผ flutter๋กœ ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌํ˜„(poco ํ”„๋กœ์ ํŠธ, openssl, sqlite, ํŠน์ • ํ”Œ๋žซํผ ์ฝ”๋“œ ํ†ตํ•ฉ ๋ธŒ๋ฆฌ์ง€ ์ฝ”๋“œ ๋“ฑ).

๋‚ด ์„ ํƒ์—๋Š” ์ด๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • C++ ๋ฐฑ์—”๋“œ๊ฐ€ ์žˆ๋Š” iOS ๋ฐ Android(ezored)
  • Flutter ๋ฐ C++๋ฅผ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉ

์ž์œ ๋กญ๊ฒŒ ํ”„๋กœ์ ํŠธ์— ์‹œ์ž‘์„ ์ถ”๊ฐ€ํ•˜์„ธ์š” :)

Kotlin Multiplatform์€ ์™„๋ฒฝํ•œ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง https://github.com/dart-lang/sdk/issues/34452 ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Unity3d๋Š” C# VM[1]์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์—”์ง„์— ํ”Œ๋Ÿฌํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ๋“  ์ด์‹ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ์„ธ๊ณ„์—์„œ๋Š” C#๊ณผ C++ ๊ฐ„์˜ ๋Œ€ํ™”๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๊ทธ๋“ค์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ "UIWidget์€ ์ฃผ๋กœ Flutter์—์„œ ํŒŒ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์บ ํ”„์™€ TurboModules๋ฅผ ์‚ฌ์šฉํ•œ ์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
1) ๋™๊ธฐ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ
2) ๋งˆ์ƒฌ๋ง์ด ์—†๊ณ 
3) C ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ C++๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ์บ ํ”„๋ฅผ ์‘์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

[1] https://github.com/UnityTech/UIWidgets

Dart 2.5๋ถ€ํ„ฐ ์ด( dart:ffi )๋Š” ํ˜„์žฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.
https://medium.com/dartlang/announcing-dart-2-5-super-charged-development-328822024970

์ข‹์€ ์†Œ์‹!

์Œ... Flutter์™€ ํ•จ๊ป˜ ์˜ค๋ณด์—๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋ถ„ํ• ๊นŒ์š”?..

https://github.com/google/oboe

@rg4real ๋„ต! ๊ทธ๋Ÿฌ๋‚˜ Oboe ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ C++๋กœ ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ C ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘ ์ง€์นจ์€ https://github.com/flutter/flutter/wiki/Binding-to-native-code-via-FFI ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/atsushieno/oboe-sharp/tree/master/native ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ C# ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ oboe-c.so ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@sjindel-google, ๋ฉ‹์ง„ ์†Œ์‹์ž…๋‹ˆ๋‹ค!

๋”ฐ๋ผ์„œ ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด C++์™€ C ์ฝ”๋“œ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Dart ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@atsushieno๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(๊ฒฝํ—˜ ๋ถ€์กฑ). ํ•˜์ง€๋งŒ ์ •ํ™•ํ•œ ์˜ค๋ณด์— ์—ฐ์ฃผ๋ผ๋Š” ์ „๋ฐ˜์ ์ธ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ์ข‹์•˜์–ด?

@rg4real ์ €๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง์€ ์˜ค๋””์˜ค๋ณด๋‹ค ๋‹จ์ˆœํ•œ API(OpenSLES์— ๋น„ํ•ด)๋ฅผ ์œ„ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์— ๋Œ€ํ•ด ์ •๋ง๋กœ ์ง„์ง€ํ–ˆ๋‹ค๋ฉด Xamarin.Android๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ (๋’ค์— ๋˜๋Š” AAudio) ์˜ค๋ณด์— ๋Œ€ํ•ด ์–˜๊ธฐํ•œ๋‹ค๋ฉด, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ Fluidsynth ๊ทธ๊ฒƒ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. AAudio๊ฐ€ OpenSLES์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ "์–ผ๋งˆ๋‚˜ ์ข‹์€์ง€" ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

C++ ์ฝ”๋“œ๊ฐ€ new/malloc์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹คํŠธ ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๋ฐฉ๋ฒ•.

C++ ์ฝ”๋“œ
๋ฌดํšจ foo(char** out) {
*out = ์ƒˆ๋กœ์šด char[25];
}

|out|์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ• ๋‹คํŠธ ์ฝ”๋“œ์˜ ๋ณ€์ˆ˜?

Dart 2.5๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด .free() ์— Pointer .free() Pointer ์žˆ์Šต๋‹ˆ๋‹ค. dev/master ๋ธŒ๋žœ์น˜์— ์žˆ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์ด package:ffi https://github.com/dart-lang/ffi/blob/master/lib/src/allocation.dart#L70์œผ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์„์— ๋”ฐ๋ผ - "[ํ• ๋‹น]๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํ• ๋‹น๋œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค." - free()๋Š” assign()๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์•ผ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ
ffi.ํฌ์ธํ„ฐptr = ffi.ํฌ์ธํ„ฐ.ํ• ๋‹น();
ptr.free();

์ด๊ฒƒ์€ ๋‹คํŠธ ์ฝ”๋“œ์—์„œ new ๋˜๋Š” malloc์„ ์‚ฌ์šฉํ•˜์—ฌ C++ ์ธก์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ?

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ malloc ํ†ตํ•ด ํ• ๋‹น๋œ ํ•œ Dart ๋˜๋Š” C++๋ฅผ ํ†ตํ•ด free ๋กœ ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹คํŠธ 2.6์—์„œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ DynamicLibrary.lookupFunction("free") ์ •์˜ free ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก, ๋‹คํŠธ ์ •ํ™•ํžˆ ๊ฐ™์€ free ํ”„๋กœ๊ทธ๋žจ์˜ C ++ ๋ถ€๋ถ„์—์žˆ๋‹ค. ( free ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๋Š” ํ•œ.)

์ด ๊ธฐ๋Šฅ์ด ์ด์ œ ๋ชจ๋“  Flutter ์ฑ„๋„์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ(๋ฒ ํƒ€ ๋ฒ„์ „) ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ๋ฌธ์ œ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ https://github.com/dart-lang/sdk/issues/new์— ์ œ์ถœ

C++ ํด๋ž˜์Šค๋ฅผ C ํ˜ธํ™˜์„ฑ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ง€์ €๋ถ„ํ•ฉ๋‹ˆ๋‹ค. plz๋Š” C++ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

+1 C++๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@KaungZawHtet ๋ฐ @fzyzcjy - ์ด์— ๋Œ€ํ•œ ์ƒˆ ๋ฐœํ–‰(์•„๋งˆ๋„ flutter๋ณด๋‹ค๋Š” dart-lang์œผ๋กœ)์„ ์—ฌ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ทธ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ตฌ๋…ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์›๋ž˜ ๋ชฉํ‘œ๋Š” ๊ฝค ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์ƒˆ๋กœ์šด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋‹ค์Œ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ์ถœํ•˜์‹ญ์‹œ์˜ค. https://github.com/dart-lang/sdk/issues/new?labels=library-ffi ,area-vm

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰