本机依赖项不会在 flutter 插件中复制到它们的目的地
native dependencies don't get copied to their destination in flutter plugin
我正在创建一个使用本机库的 Flutter 插件。我面临的问题是,我添加的本机依赖项没有被复制到 Android 的 context.nativeLibraryDir
。以下是我的配置。
这是我的 android
插件文件夹(不是示例应用程序)的文件结构。
在我的插件的 build.gradle
中,我有以下内容。我也试过研究后添加jni.srcDirs = []
,但它也没有用。
sourceSets {
main {
jniLibs.srcDirs += 'src/main/jniLibs'
java.srcDirs += 'src/main/kotlin'
}
}
我认为以上所有内容都是正确的,因为以下是我构建的 APK(示例应用程序的),它具有库。
但是在安装示例应用程序后(在 Android x86 模拟器上,也在 arm64 设备上测试),当我尝试执行本机库时它崩溃了,我想将它们用作可执行文件(它有效在一个独立的 android 项目中,现在我只是复制了插件中的库和一些代码)
我发现的有趣的事情是,flutter 的 libflutter.so
也没有被复制,我想这是正常功能所必需的。如果没有 libflutter.so
,应用程序应该会崩溃,但它不会。
我也尝试过将 ndk.abiFilters
添加到示例应用程序的 build.gradle
但没有成功。
只是偶然发现了同样的问题,并在我的案例中找到了以下解决方案(带有本机库的 Flutter 插件):
android/src/main/AndroidManifest.xml
...
<application
android:extractNativeLibs="true"
...
>
...
详情:
自 Android 6.0 系统库可以未压缩地存储在 APK 中,而不必提取并存储在其他地方 (https://medium.com/androiddevelopers/smallerapk-part-8-native-libraries-open-from-apk-fc22713861ff)。通过 (Java):
支持在 APK 中加载系统库
static { System.loadLibrary(..); }
参见 https://developer.android.com/reference/java/lang/System#loadLibrary(java.lang.String)。
如果需要提取 Flutter 插件的系统库(例如,因为您不能只在 System.loadLibrary
上构建),可以在插件的 Manifest 应用程序元素中使用 android:extractNativeLibs="true"
(https://developer.android.com/guide/topics/manifest/application-element).
需要注意的重要一点是,DSL 的实现方式 (https://developer.android.com/studio/releases/gradle-plugin?buildsystem=ndk-build#compress-native-libs-dsl) 不适用于我的情况(Flutter 插件)。
我正在创建一个使用本机库的 Flutter 插件。我面临的问题是,我添加的本机依赖项没有被复制到 Android 的 context.nativeLibraryDir
。以下是我的配置。
这是我的 android
插件文件夹(不是示例应用程序)的文件结构。
在我的插件的 build.gradle
中,我有以下内容。我也试过研究后添加jni.srcDirs = []
,但它也没有用。
sourceSets {
main {
jniLibs.srcDirs += 'src/main/jniLibs'
java.srcDirs += 'src/main/kotlin'
}
}
我认为以上所有内容都是正确的,因为以下是我构建的 APK(示例应用程序的),它具有库。
但是在安装示例应用程序后(在 Android x86 模拟器上,也在 arm64 设备上测试),当我尝试执行本机库时它崩溃了,我想将它们用作可执行文件(它有效在一个独立的 android 项目中,现在我只是复制了插件中的库和一些代码)
我发现的有趣的事情是,flutter 的 libflutter.so
也没有被复制,我想这是正常功能所必需的。如果没有 libflutter.so
,应用程序应该会崩溃,但它不会。
我也尝试过将 ndk.abiFilters
添加到示例应用程序的 build.gradle
但没有成功。
只是偶然发现了同样的问题,并在我的案例中找到了以下解决方案(带有本机库的 Flutter 插件):
android/src/main/AndroidManifest.xml
...
<application
android:extractNativeLibs="true"
...
>
...
详情:
自 Android 6.0 系统库可以未压缩地存储在 APK 中,而不必提取并存储在其他地方 (https://medium.com/androiddevelopers/smallerapk-part-8-native-libraries-open-from-apk-fc22713861ff)。通过 (Java):
支持在 APK 中加载系统库static { System.loadLibrary(..); }
参见 https://developer.android.com/reference/java/lang/System#loadLibrary(java.lang.String)。
如果需要提取 Flutter 插件的系统库(例如,因为您不能只在 System.loadLibrary
上构建),可以在插件的 Manifest 应用程序元素中使用 android:extractNativeLibs="true"
(https://developer.android.com/guide/topics/manifest/application-element).
需要注意的重要一点是,DSL 的实现方式 (https://developer.android.com/studio/releases/gradle-plugin?buildsystem=ndk-build#compress-native-libs-dsl) 不适用于我的情况(Flutter 插件)。