web-dev-qa-db-ja.com

Reactネイティブの期待Java.lang.UnsatisfiedLinkError:dlopenが失敗しました: "/data/data/{package}/lib-main/libgnustl_shared.so"は64ビットではなく32ビットです

React Nativeを既存のAndroid Appと統合しようとしています。初期化時に次の例外が発生しますReactネイティブ画面:

Java.lang.UnsatisfiedLinkError:dlopenが失敗しました: "/data/data/com.snapdeal.main/lib-main/libgnustl_shared.so"は64ビットではなく32ビットです

アプリは64ビットデバイスでのみクラッシュします。

これまでの私の学習によると、私はこれを発見しました issue React Native Repoで報告されましたが、このスレッドで提案された solution は既存のアプリで外部SOライブラリを使用していないため、役に立ちません。

上記とは別に、アプリがインストールされているデバイスのライブラリ構造に別の違いがあることに気付きました。アプリの構造とネイティブデモアプリの反応を比較しています。

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ビットバイナリをサポートしており、外部ライブラリを使用していません。

15
Ishan Dhingra

React Nativeは64ビットバージョンのネイティブコードを提供せず、システムは常に32ビットにフォールバックします。彼らはこの問題を解決しており、 RN 0.59 releaseの一部になる予定ですRef: https://github.com/facebook/react-native/issues/2814#issuecomment-457644191

1
Dishant Walia
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
0
Balaji