[android] React-Native : java.lang.UnsatisfiedLinkError :로드 할 DSO를 찾을 수 없음 : libhermes.so

React -native 버전 0.60.2 를 사용하도록 프로젝트를 업데이트 했습니다 . 그러나 Android 장치에서 응용 프로그램을 실행하려고 할 때 시작 화면 후에 충돌이 발생합니다. 다음과 같은 오류 로그가 있습니다.

E/AndroidRuntime: FATAL EXCEPTION: create_react_context
    Process: com.tjspeed, PID: 3909
    java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libhermes.so
        at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:738)
        at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:591)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:529)
        at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:484)
        at com.facebook.hermes.reactexecutor.HermesExecutor.<clinit>(HermesExecutor.java:20)
        at com.facebook.hermes.reactexecutor.HermesExecutorFactory.create(HermesExecutorFactory.java:27)
        at com.facebook.react.ReactInstanceManager$5.run(ReactInstanceManager.java:949)
        at java.lang.Thread.run(Thread.java:760)

여기에 몇 가지 제안이 있습니다 : https://github.com/facebook/react-native/issues/25601 그러나 불행히도 그들 중 누구도 나를 위해 일하지 않았습니다. 해결 방법을 제안하십시오.



답변

0.59.8에서 0.60.4로 업그레이드 한 후에도 동일한 문제가 발생했습니다.

app / build.gradle에이 모든 줄을 추가했는지 확인하세요 . 특히 종속성 부분은 JSC 바이너리가 있는지 확인합니다.

project.ext.react = [

...
    // your index js if not default, other settings
  // Hermes JSC ?
 enableHermes: false,

...
]

def jscFlavor = 'org.webkit:android-jsc:+'

def enableHermes = project.ext.react.get("enableHermes", false);

dependencies {

    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.facebook.react:react-native:+"  // From node_modules

    if (enableHermes) {
      // For RN 0.60.x
      def hermesPath = "../../node_modules/hermesvm/android/"

      // --- OR ----          

      // for RN 0.61+
      def hermesPath = "../../node_modules/hermes-engine/android/";


      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }

편집하다

또한 Hermes Maven 저장소가 루트 빌드 에 있는지 확인하십시오.

maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }


답변

이 블록을 project_dir / build.gradle의 allProject 블록에 추가했는데 충돌이 사라졌습니다.

    maven {
        // Android JSC is installed from npm
        url("$rootDir/../node_modules/jsc-android/dist")
    }

내가 한 일은 react-native init로 새 프로젝트를 만들고 Android 빌드 파일을 살펴 보는 것입니다. 다행히도 이것은 내가 발견하고 문제를 해결 한 첫 번째 차이점이었습니다. 이것이 작동하지 않으면 똑같이 할 수 있다고 생각합니다.


답변

방금 Android 용 빌드 폴더를 정리 한 후 정상적으로 작동했습니다. 짝짓기를 돕는 희망.

cd android
./gradlew clean


답변

  1. node_modules / jsc-android / README.md를 엽니 다.
  2. ‘내 반응 네이티브 앱과 함께 사용하는 방법’섹션을 찾습니다.

예를 들면 :

  1. android / build.gradle 수정
allprojects {
    repositories {
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Local Maven repo containing AARs with JSC library built for Android
            url "$rootDir/../node_modules/jsc-android/dist"
        }
        google()
        jcenter()

    }
}
  1. android / app / build.gradle 수정
android {
    packagingOptions {
        pickFirst '**/libjsc.so'
        pickFirst '**/libc++_shared.so'
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation "org.webkit:android-jsc:+"
    implementation "com.facebook.react:react-native:+" // From node_modules
}


답변

나는 이것을 추가하여 해결했습니다.

 configurations.all {
    resolutionStrategy {
        force "com.facebook.soloader:soloader:0.8.2"
    }
}


답변

React Native 버전으로 업데이트하는 동안이 오류가 발생하는 경우 0.62.2:

android/app/build.gradle파일에 다음을 추가 하십시오.

dependencies {
   implementation 'com.facebook.soloader:soloader:0.9.0+'

첫 번째 implementation항목 중 하나로 .

여기에서 가져온 솔루션


답변

이 문제가 발생하는 다른 경우에는 비슷해 보이는 섹션이 2 개 있습니다. ! 에서 하단 repositories섹션 을 업데이트해야합니다 android/build.gradle.

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28
        supportLibVersion = "28.0.0"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:3.4.1")

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }

        google()
        jcenter()
    }
}