使用 Flutter 从 Android 上的本地编译共享库调用函数

tro*_*dhe 4 c++ android ffi dart flutter

我已按照https://flutter.dev/docs/development/platform-integration/c-interop 上的说明进行操作,并成功地使用 ac abi 编译了 cpp,并在使用 CMake 集成的模拟 android 设备上使用 dart:ffi 调用了它. 这将编译一个lib*.so文件,将它与 flutter 包一起复制并放置,以便我可以在我的 flutter 代码中轻松访问它。

但是,假设我已经有一个已编译的共享库,要么是自己编译的,要么是在使用 CMake 之外与 Android 及其给定的 cpu 架构一起使用的某个地方。

我如何将它添加到颤振系统,以便将它复制并放置在一个“可解析”的位置,就像添加时所做的一样

android {
 //...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将目标添加到带有包的 CMake 文件中?

有关详细信息,我已经使用 cargo-ndk 和正确的架构编译了一个 rust 共享库,但是无论我尝试过什么,我只会在尝试使用 `ffi.DynamicLibrary.open(...) 打开它时出错。

我猜它的东西非常简单,但我想不出办法。

我的 dartffi.DynamicLibrary代码链接到 Windows 上的本机库没有问题。所以似乎主要是Android/flutter/gradle打包问题。

Igo*_*din 5

要添加预编译共享库,您需要将它放在android/app/src/main/jniLibs/X文件夹中,其中 X 是体系结构名称(armeabi-v7a 或 arm64-v8a)。虽然它是库的默认路径,但我不确定是否有必要,但将此文件夹指定为build.gradle 中的源集可能更安全:

android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }        
}
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够使用 DartDynamicLibrary.open和 Java 的System.loadLibrary.