我正在尝试将React Native与我现有的Android App集成。在启动React Native Screen时,我得到以下异常:
java.lang.UnsatisfiedLinkError:dlopen失败: “/ data / data /com.snapdeal.main/lib-main/libgnustl_shared.so”是32位 而不是64位
应用程序仅在64位设备上崩溃。
根据我到目前为止的学习情况,我发现此issue报告了React Native Repo,但此线程中建议的solution没有用,因为我没有使用任何外部SO库现有的应用程序。
除此之外,我已经意识到安装了我的应用程序的设备上的库结构的另一个区别。我正在比较我的App vs react本机演示应用程序的结构。
反应演示应用
root@generic_x86_64:**/data/data/com.react.demo/lib** # ls
libfb.so
libfolly_json.so
libglog.so
libglog_init.so
libgnustl_shared.so
libicu_common.so
libimagepipeline.so
libjsc.so
libreactnativejni.so
libreactnativejnifb.so
root@generic_x86_64:/data/data/**com.react.demo**/lib-main # ls
dso_deps
dso_lock
dso_manifest
dso_state
我的应用
root@generic_x86_64:/data/data/**com.my.app**/lib-main # ls
dso_deps
dso_lock
dso_manifest
dso_state
libfb.so
libfolly_json.so
libglog.so
libglog_init.so
libgnustl_shared.so
libicu_common.so
libimagepipeline.so
libjsc.so
libreactnativejni.so
libreactnativejnifb.so
分享关于我的项目的更多细节:
的package.json
{
"name": "projectname",
"version": "1.0.0",
"description": "Native NPM",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node node_modules/react-native/local-cli/cli.js start"
},
"repository": {
"type": "git",
"url": ""
},
"author": "Ishan D",
"license": "ISC",
"dependencies": {
"react": "^15.3.2",
"react-native": "^0.37.0",
"react-native-linear-gradient": "^1.5.15",
"rn-viewpager": "^1.1.3"
},
"devDependencies": {}
}
在android原生项目中使用的依赖项
ext {
compileSdkVersion = 24
buildToolsVersion = '24.0.2'
minSdkVersion = 16
targetSdkVersion = 24
supportLibrariesVersion = '23.0.1'
playServiceVersion = '9.0.2'
dep = [
fabricPlugin : 'io.fabric',
fabricMavenUrl : 'https://maven.fabric.io/public',
fabricClasspath : 'io.fabric.tools:gradle:1.+',
playServiceClasspath : 'com.google.gms:google-services:1.3.0-beta1',
playServicePlugin : 'com.google.gms.google-services',
playServiceAppindexing: "com.google.android.gms:play-services-appindexing:$playServiceVersion",
playServiceLocation : "com.google.android.gms:play-services-location:$playServiceVersion",
playServiceVision : "com.google.android.gms:play-services-vision:$playServiceVersion",
playServiceAuth : "com.google.android.gms:play-services-auth:$playServiceVersion",
playServiceBase : "com.google.android.gms:play-services-base:$playServiceVersion",
playServiceIdentity : "com.google.android.gms:play-services-identity:$playServiceVersion",
playServiceAnalytics : "com.google.android.gms:play-services-analytics:$playServiceVersion",
playServiceGcm : "com.google.android.gms:play-services-gcm:$playServiceVersion",
underCouchClasspath : 'de.undercouch:gradle-download-task:2.0.0',
underCouchPluigin : 'de.undercouch.download',
crashlytics : 'com.crashlytics.sdk.android:crashlytics:2.4.0@aar',
moengage : 'com.moengage:moe-android-sdk:6.0.29',
supportV4 : "com.android.support:support-v4:$supportLibrariesVersion",
supportAppCompatV7 : "com.android.support:appcompat-v7:$supportLibrariesVersion",
supportCardviewV7 : "com.android.support:cardview-v7:$supportLibrariesVersion",
supportDesignV7 : "com.android.support:design:$supportLibrariesVersion",
okhttp : 'com.squareup.okhttp:okhttp:2.5.0',
junit : 'junit:junit:4.12',
mockito : 'org.mockito:mockito-core:1.10.19'
]
}
任何线索都表示赞赏。
PS:我知道react-native确实支持64位二进制文件,而且我没有使用任何外部库。
答案 0 :(得分:18)
将以下内容添加到app / gradle文件
defaultConfig {
....
ndk {
abiFilters "armeabi-v7a", "x86", 'armeabi', 'arm64-v8a'
}
packagingOptions {
exclude "lib/arm64-v8a/libgnustl_shared.so"
}
}
还要确保使用相同的端口。
adb reverse tcp:8081 tcp:8081
答案 1 :(得分:2)
它还可以帮助您: build.gradle(应用程序)
android{
...
defaultConfig {
....
ndk {
abiFilters "armeabi-v7a", "x86", 'armeabi', 'arm64-v8a'
}
packagingOptions {
exclude "lib/arm64-v8a/libgnustl_shared.so"
exclude '/lib/mips64/**'
exclude '/lib/arm64-v8a/**'
exclude '/lib/x86_64/**'
}
...
}
}
答案 2 :(得分:0)
React Native不提供本机代码的64位版本,并且系统始终回退到32位。
他们已解决此问题,并计划成为RN 0.59 release
的一部分
参考:https://github.com/facebook/react-native/issues/2814#issuecomment-457644191
答案 3 :(得分:0)
Using RN 0.60.5 version.
If you guys are wondering why your app crashes if you download it from playstore, make the below changes
**packagingOptions {
exclude '/lib/mips64/'
exclude '/lib/arm64-v8a/'
exclude '/lib/x86_64/**'
//In pickFirst, replace the library name with the library that is causing error.
pickFirst '/lib/x86/libgnustl_shared.so'
pickFirst '/lib/armeabi-v7a/libgnustl_shared.so'
}**
REASON - We are excluding all 64 bit libraries so that OS will not have confusion of which library to pick.
If you do not know which library is causing the crash, upload your bundle in Firebase test lab and then check. It will tell you which library is throwing the error