[Flutter] 윈도우에서 DLL을 적용하고 싶다면

zunu·2025년 1월 21일

Flutter는 애플리케이션 뿐만 아니라 Windows/Mac용으로도 프로그램을 빌드할 수 있는 크로스 플랫폼 프레임워크이다.

그래서 Window 프로그램을 만들던 중, C로 만들어진 DLL을 연동해야할 일이 생겼다.

FLutter에서 네이티브 코드를 연동은 해봤어도 DLL연동은 안될 줄 알았는데, 이것마저 된다니...

잡설은 이만하고 방법을 알아보자.

Dart:ffi(Foreign Function Interface) 라이브러리에는 DynamicLibrary class라는 클래스가 있다.

간단히 이 클래스는 공유 라이브러리(Shared Library)를 동적으로 로드하고 해당 라이브러리의 함수를 Dart에서 호출할 수 있도록 인터페이스를 제공한다고 한다.

해당 공유 라이브러리는 사용되는 플랫폼마다 확장자가 달라야 하는데,

Android의 경우 .so (Shared Object)
IOS/MACOS의 경우 .dylib (Dynamic Library)
Window는 .dll (Dynamic Link Library)

이다.

나는 Window에서 활용을 해야 하기 때문에 dll파일을 준비했다.

DynamicLibrary.open(String path)을 통해서 경로를 설정해주고

lookup(String symbolName)을 통해 네이티브 라이브러리에서 특정 심볼(함수 또는 변수)을 검색한다.

예를 들어 C를 통해

#include <stdio.h>

int add(int a, int b) {
  return a + b;
}

이와 같은 함수를 만들어 dll을 만들었다고 치면

import 'dart:ffi';
import 'dart:io';

typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);

void main() {
// 플랫폼마다 경로를 다르게 해주어야 한다.
final path = Platform.isWindows ? 'example.dll' :
             Platform.isMacOS ? 'libexample.dylib' :
             'libexample.so';

// 네이티브 라이브러리를 로드한다.
final DynamicLibrary nativeLib = DynamicLibrary.open(path);

// 네이티브 함수를 라이브러리에서 가져온다.
final DartAdd add = nativeLib
    .lookup<NativeFunction<NativeAdd>>('add') // 심볼명 'add'
    .asFunction();

// 함수 호출
final result = add(10, 20);
print('Result: $result'); // 출력: Result: 30
}

이와 같이 사용할 수 있다. 보통 C에서는 포인터를 사용하는 경우가 많은데 이 경우에는 Dart:ffi 라이브러리에 있는 Pointer Class를 사용해주면 똑같이 포인터로 사용이 가능하다.

profile
개발새발

0개의 댓글