使用 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.

加载它