我正在尝试在react-native中启用ffmpeg-kit-react-native包。 example中给出的示例命令成功执行。但我想使用
libwebp
将 gif 文件转换为 webp,该文件位于名为 video
的 package下。按照指示。我必须启用 package 才能使用一些库。
2.2.1 在 Android 上启用包 编辑 android/build.gradle 文件并在 ext.ffmpegKitPackage 变量中添加包名称。
ext { ffmpegKitPackage = "<package name>" }
所以我在
node_module/ffmpeg-kit-react-native/android/build.gradle
中添加了一行
android {
compileSdkVersion 30
defaultConfig {
minSdkVersion safeExtGet('ffmpegKitPackage', 'https').contains("-lts") ? 16 : 24
targetSdkVersion 30
versionCode 451
versionName "4.5.1"
}
buildTypes {
release {
minifyEnabled false
}
}
lintOptions {
disable 'GradleCompatible'
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
rootProject.ext.ffmpegKitPackage = "video" // Added this line here
}
错误:
* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeJavaResWorkAction
> 2 files found with path 'lib/arm64-v8a/libc++_shared.so' from inputs:
- C:\Users\ADMIN\.gradle\caches\transforms-3\7403ebe5571a2ce5a6a5fc9876af4814\transformed\jetified-react-native-0.66.4\jni
- C:\Users\ADMIN\.gradle\caches\transforms-3\4be54e44fe38656741a8345504588323\transformed\jetified-ffmpeg-kit-video-4.5.1-1\jni
If you are using jniLibs and CMake IMPORTED targets, see
https://developer.android.com/r/tools/jniLibs-vs-imported-targets
我已经尝试过 ./gradlew clean 但问题仍然存在。 如何修复这个错误?谢谢
将此添加到您的
node_module/ffmpeg-kit-react-native/android/build.gradle
android{
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
}
rootProject.ext.ffmpegKitPackage = "video"
}
ffmpeg-kit-react-native 已经在这里讨论过这个错误。 https://github.com/tanersener/ffmpeg-kit/wiki/Tips#2-depending-another-android-library-containing-libc_sharedso
我正在使用 react native 0.68.2,我的问题已通过应用以下更改得到解决。
编辑
android/build.gradle
并强制所有模块使用与您的项目相同的react-native版本。
allprojects {
// ...
def REACT_NATIVE_VERSION = new File(['node', '--print',"JSON.parse(require('fs').readFileSync(require.resolve('react-native/package.json'), 'utf-8')).version"].execute(null, rootDir).text.trim())
configurations.all {
resolutionStrategy {
force "com.facebook.react:react-native:" + REACT_NATIVE_VERSION
}
}
}
您可以查看这个以获取更多信息
您需要在 build.gradle(app) 中添加以下内容:
android {
//2 files found for path lib/arm64-v8a/libc++_shared.so. This version of the Android Gradle Plugin chooses the f
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
}
这对我有用。在反应0.68.2中。还有 0.69.x.
android{
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
}
rootProject.ext.ffmpegKitPackage = "video"
}
//如果上面不起作用,请尝试下面的代码
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
我们在将 expo 集成到具有许多依赖项的现有 React-Native 应用程序时遇到了这个问题。解决方案是遵循打包选项更改并将其应用到所有子项目,如下所示:
subprojects {
afterEvaluate( { project ->
if (project.getPlugins().hasPlugin('android') ||
project.getPlugins().hasPlugin('android-library')) {
project.configure(project.android) {
packagingOptions {
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/arm64-v8a/libc++_shared.so'
}
}
}
})
}