Реагировать на собственное ожидание java.lang.UnsatisfiedLinkError: dlopen failed: /data/data/{package}/lib-main/libgnustl_shared.so является 32-разрядным вместо 64-разрядного

Я пытаюсь интегрировать React Native с моим существующим приложением для Android. Я получаю следующее исключение при инициализации React Native Screen:

java.lang.UnsatisfiedLinkError: ошибка dlopen: «/data/data/com.snapdeal.main/lib-main/libgnustl_shared.so» является 32-разрядным вместо 64-разрядного

Приложение аварийно завершает работу только на 64-разрядных устройствах.

Насколько мне известно, я обнаружил, что об этой проблеме сообщается React Native Repo, но решение, предложенное в этой теме, бесполезно, поскольку Я не использую какую-либо внешнюю библиотеку 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-битные двоичные файлы, и я не использую никаких внешних библиотек.


person Ishan Dhingra    schedule 19.11.2016    source источник


Ответы (4)


Добавьте следующее в файл 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
person DoronK    schedule 20.12.2016

Это также может вам помочь: 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/**'
      }
      ...
   }
}
person AlexS    schedule 19.10.2018
comment
Поддерживает ли развертывание APK с помощью этого build.gradle 64-разрядную версию для магазина Google Play? - person gypsicoder; 09.09.2019
comment
Нет, Google не позволит, так как 64-битная, также вы можете проверить Build -> Analyze Apk. - person Ajay Pandya; 25.09.2020

React Native не предоставляет 64-разрядную версию нативного кода, и система всегда возвращается к 32-разрядной версии. Они решили эту проблему и планируют стать частью RN 0.59 release Ref: https://github.com/facebook/react-native/issues/2814#issuecomment-457644191

person Dishant Walia    schedule 06.03.2019

person    schedule
comment
Пожалуйста, добавьте описание к вашему ответу - person El.Hum; 25.08.2019