我正在尝试在 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.so
android/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'