使用 Flutter 从 Android 上的本机编译共享库调用函数
Calling functions from native compiled shared library on Android with Flutter
我已按照 https://flutter.dev/docs/development/platform-integration/c-interop 中的说明进行操作,并成功地使用 c abi 编译了 cpp,并在使用 CMake 集成的模拟 android 设备上使用 dart:ffi 调用了它。这会编译一个 lib*.so
文件,将其与 flutter 包一起复制并放置,以便我可以在我的 flutter 代码中轻松访问它。
但是,假设我已经有一个已编译的共享库,要么是我自己编译的,要么是在某个地方可以使用 Android 及其给定的 cpu 架构,但不使用 CMake。
如何将它添加到 flutter 系统中,以便将其复制并放置在 "resolvable" 位置,就像添加
时一样
android {
//...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
在包中的 CMake 文件中添加目标?
有关详细信息,我已经使用 cargo-ndk 和正确的架构在 rust 中编译了一个共享库,但是无论怎样,我都只会在尝试使用 `ffi.DynamicLibrary.open(...) 打开它时出错我试过了。
我猜这件事简单得有些愚蠢,但我想不出办法。
我的 dart ffi.DynamicLibrary
代码链接到 Windows 上的本机库没有问题。所以这似乎主要是 Android/flutter/gradle 包装问题。
要添加您的预编译共享库,您需要将其放在 android/app/src/main/jniLibs/X
文件夹中,其中 X 是体系结构名称(armeabi-v7a 或 arm64-v8a)。虽然它是库的默认路径,但我不完全确定是否有必要,但将此文件夹指定为 build.gradle 中的源集可能更安全:
android {
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
之后你应该可以使用 Dart 的 DynamicLibrary.open
和 Java 的 System.loadLibrary
.
加载它
我已按照 https://flutter.dev/docs/development/platform-integration/c-interop 中的说明进行操作,并成功地使用 c abi 编译了 cpp,并在使用 CMake 集成的模拟 android 设备上使用 dart:ffi 调用了它。这会编译一个 lib*.so
文件,将其与 flutter 包一起复制并放置,以便我可以在我的 flutter 代码中轻松访问它。
但是,假设我已经有一个已编译的共享库,要么是我自己编译的,要么是在某个地方可以使用 Android 及其给定的 cpu 架构,但不使用 CMake。
如何将它添加到 flutter 系统中,以便将其复制并放置在 "resolvable" 位置,就像添加
时一样android {
//...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
在包中的 CMake 文件中添加目标?
有关详细信息,我已经使用 cargo-ndk 和正确的架构在 rust 中编译了一个共享库,但是无论怎样,我都只会在尝试使用 `ffi.DynamicLibrary.open(...) 打开它时出错我试过了。
我猜这件事简单得有些愚蠢,但我想不出办法。
我的 dart ffi.DynamicLibrary
代码链接到 Windows 上的本机库没有问题。所以这似乎主要是 Android/flutter/gradle 包装问题。
要添加您的预编译共享库,您需要将其放在 android/app/src/main/jniLibs/X
文件夹中,其中 X 是体系结构名称(armeabi-v7a 或 arm64-v8a)。虽然它是库的默认路径,但我不完全确定是否有必要,但将此文件夹指定为 build.gradle 中的源集可能更安全:
android {
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}
之后你应该可以使用 Dart 的 DynamicLibrary.open
和 Java 的 System.loadLibrary
.