我正在尝试在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");
我抛出一个错误,说找不到lib。
因此,我的问题是,应该将.so
库放在项目文件夹中的什么位置,以便可以访问它。对于.framework
干杯! ?
编辑:
在@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))
答案 0 :(得分:0)
对于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'