dart-archive / ffi

Utilities for working with Foreign Function Interface (FFI) code
https://pub.dev/packages/ffi
BSD 3-Clause "New" or "Revised" License
156 stars 32 forks source link

Unable to load .so library in flutter using platform android emulator #184

Closed santoshyadav140293 closed 1 year ago

santoshyadav140293 commented 1 year ago

Hi,

I am working on flutter application using andriod emulator.

I have used the following dart code to load ".so" and ".dll" file.

var libraryPath = path.join( Directory.current.path, 'primitives_library', 'TestLibrary.so');

final dylib = DynamicLibrary.open(libraryPath);

but when i build project it gives following error. DynamicLibrary.open error: Invalid argument(s): Failed to load dynamic library (126)

Please suggest any solution to load ".so" library using emulator.

dcharkes commented 1 year ago

Hi @santoshyadav140293, nice to meet you!

You need to bundle your library in the jniLibs folder in the generated flutter create --template=plugin_ffi --platform=android. Place the .so file in android/src/main/jniLibs/${target.architecture.cmakeAndroid}/. See more info on https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs

Did you make a Flutter FFI plugin or a Dart standalone package? Dart standalone packages are currently not supported in Flutter applications. This is being tracked in:

santoshyadav140293 commented 1 year ago

Yes, I am using Flutter FFI plugin.

Kindly confirm weather we can build ".so" library from Android Studio only or we can use some other tools.

Is there any difference between Android ".so" library and Linux ".so" library ?

@dcharkes Please suggest.

dcharkes commented 1 year ago

Is there any difference between Android ".so" library and Linux ".so" library ?

Yes, they are very different.

They use a different ABI (application binary interface), they likely run on different hardware (your linux machine is like x64, while your Android device is likely arm64). You can see the ABI with for example: https://stackoverflow.com/questions/35424987/how-to-get-architecture-of-a-shared-object-file-so-file-using-gnu-c-program

They also use different libraries for system calls etc. So for Android you will always need to compile with the Android NDK.

Kindly confirm whether we can build ".so" library from Android Studio only or we can use some other tools.

You can build it from Android studio, or with any other compiler that can target the Android NDK.

santoshyadav140293 commented 1 year ago

Thank you for the response it helps me a lot.