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

时间:2019-11-12 14:20:37

标签: flutter dart

我正在尝试在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

的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))

1 个答案:

答案 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'