从颤振插件加载预构建的动态库



我正在尝试在 Flutter 项目中使用我的C++库。为此,我遵循本指南 https://flutter.dev/docs/development/platform-integration/c-interop 从源代码部分跳过构建,因为在我的情况下,库已经构建。

我的librPPG.so是我的项目的根目录,当我尝试将其加载到./lib/rppg_plugin.dart中时

,如下所示:
final DynamicLibrary rPPGLib = Platform.isAndroid
? DynamicLibrary.open("../librPPG.so")
: DynamicLibrary.open("rPPG.framework/rPPG");

我被抛出一个错误,说找不到库。

因此,我的问题是,我应该将.so库放在项目文件夹中的什么位置,以便我可以访问它。与.framework的IOS相同的问题

干杯! 🙂

编辑:

从@igor的输入来看,这是我的当前状态

librPPG.soandroid/src/main/jniLibs/

android/build.gradle

android {
compileSdkVersion 28
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
main.jniLibs.srcDirs += 'src/main/jniLibs'
}
defaultConfig {
externalNativeBuild {
cmake {
}
}
minSdkVersion 21
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
lintOptions {
disable 'InvalidPackage'
}
}

android/CMakeLists.txt

cmake_minimum_required(VERSION 3.4.1)
add_library(librPPG SHARED IMPORTED )
set_target_properties(librPPG PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/librPPG.so)

并且该库加载到我的插件中,如下所示:

final DynamicLibrary rPPGLib = Platform.isAndroid
? DynamicLibrary.open("librPPG.so")
: DynamicLibrary.open("rPPG.framework/rPPG");

当我运行代码时,我仍然收到此错误

ArgumentError (Invalid argument(s): Failed to load dynamic library (dlopen failed: library "librPPG.so" not found))

对于 Android,为每个架构(arm64-v8a、armeabi-v7)创建src/main/jniLibs文件夹和子目录。为每个体系结构放置 .so 文件。编辑插件的build.gradle文件:

android {
defaultConfig {
externalNativeBuild {
cmake {
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
}

在 CMakeFile 中指定共享库:

cmake_minimum_required(VERSION 3.4.1)
add_library( librPPG SHARED IMPORTED )
set_target_properties(librPPG PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/librPPG.so)

如果不需要为每个 ABI 使用单独的 .so,则可以更改路径。同时删除"../' 来自DynamicLibrary.open调用 - 这是一个库名称,而不是路径。

我对iOS的看法可能是错误的。要包含 iOS 框架,请将以下行添加到插件的 .podspec 文件中:

s.preserve_paths = 'rPPG.framework'
s.xcconfig = { 'OTHER_LDFLAGS' => '-framework rPPG' }
s.vendored_frameworks = 'rPPG.framework'

最新更新