[Dart] flutter(dart)에서 dll 불러오기
flutter에서 사용할 dll 만들기는 이쪽을 참고.
[C/C++] dll 작성 (window)
visual studio 2019사용, 환경은 window 64-bit. 처음엔 gcc 쓰려고 했는데 gcc로 컴파일한 걸 다른 언어로 작성한 프로그램에서 실행하자니 오류가 나서...일단 간단하고 편하게 하기 위해 visual studio 2019 기
temphi20.tistory.com
크게 어렵지 않다.
1. pub.dev에서 ffi package 다운로드
2. project root folder에 준비된 dll을 추가
3. 아래 소스 코드처럼 library와 함수를 불러온다.
final DynamicLibrary func = DynamicLibrary.open('func.dll');
final int Function(int n) intFunc =
func.lookup<NativeFunction<Int32 Function(Int32)>>('int_func').asFunction();
NativeFunction class를 살펴보녀 NativeFunction<T extends Function>라고 되어 있는데, T는 dll에서 return하는 type이고 Funtion은 Function(NativeType)의 형식으로 사용해주면 된다. 괄호 안에 들어가는 것은 당연히 dll에 전달할 argument.
Dart코드로 정의하는 함수 타입 역시 NativeFunction에 적은 NativeType과 맞춰 작성해준다.
NativeFunction에는 Dart의 int, double, String 등이 들어갈 수 없으니 주의하자. (어차피 오류나서 못 쓴다.)
C/C++과 Dart 간의 type mapping(Dart type ↔ NativeType class)은 아래 링크를 참고.
[Dart] dart:ffi NativeType 관련 정리 및 Pointer 사용법 (추후 추가)
아직 이것저것 실험해보는 중이라 부족할 수 있다. Flutter 2.10.3, window10 64bit 환경에서 테스트. 1. int inteager 관련은 종류가 많다. signed: Int8, Int16, Int32, Int64 unsigned: Uint8, Uint16, Uint32,..
temphi20.tistory.com
+위는 윈도우 환경에서 테스트한 코드이며, 플랫폼에 다라 사용 방법이 조금씩 다른 모양이다. 공식 문서 참고.
Binding to native code using dart:ffi
To use C code in your Flutter program, use the dart:ffi library (currently in preview).
flutter-ko.dev
테스트 중 겪었던 몇 가지 에러 및 주의사항들:
- Failed to load dynamic library (error code 193): 64bit 환경인데 32bit로 dll을 컴파일해서 생긴 오류였다. 몇 비트인지 확인 제대로 할 것.
- Failed to load dynamic library (error code 126): dll을 위한 함수 작성시 extern "C"를 사용하지 않아 생긴 오류였다. 같은 C++로 테스트했을 땐 문제가 없었는데, dart로 돌리니 문제가 생겨서 찾기 힘들었음...
- dll의 내용이 바뀔 경우, hot reload로는 update가 되지 않는다. 껐다가 다시 실행하면 적용된다.
'Flutter' 카테고리의 다른 글
[Dart] dart:ffi NativeType 관련 정리 및 Pointer 사용법 (추후 추가) (0) | 2022.03.24 |
---|---|
[Flutter] ipa build Xcode segmentfault 11 문제 (0) | 2022.03.22 |
[Flutter] ipa build 및 browser를 통한 ipa 설치 설정 방법 (0) | 2022.03.17 |
[Flutter] class operator override (0) | 2021.12.17 |
[Flutter] 현재 url 가져오기, 새 창으로 열기 (0) | 2021.12.13 |