【问题标题】:Integrating react-native into existing Android App将 react-native 集成到现有的 Android 应用程序中
【发布时间】:2017-05-04 09:04:12
【问题描述】:

我们正在尝试将 react-native 集成到我们现有的 android 应用程序中: 我们的 build.gradle 的 SDK 要求是: minSdkVersion 16 targetSdkVersion 23

我们使用 Intent 调用初始的 React index.js:

Intent inte = new Intent(this, ReactNativeStarter.class);
startActivity(inte);

其余代码来自 react 集成教程。

当我们尝试调用我们的 react 组件时,我们得到以下错误:

Caused by: java.lang.IllegalAccessError: Method 'void android.support.v4.net.ConnectivityManagerCompat.<init>()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' 
     (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in /data/data/at.??????/files/instant-run/dex/slice-com.facebook.react-react-native-0.20.1_3762d580ab3ced1fa2f7503493d38e666994b9fa-classes.dex)
        at com.facebook.react.modules.netinfo.NetInfoModule.<init>(NetInfoModule.java:55)

你能帮忙吗?

完整的错误日志:

12-19 10:07:22.157 30271-32680/at.???? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #4
    Process: at.?????, PID:
    java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:300)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)
     Caused by: java.lang.IllegalAccessError: Method 'void android.support.v4.net.ConnectivityManagerCompat.<init>()' is inaccessible to class 'com.facebook.react.modules.netinfo.NetInfoModule' 
     (declaration of 'com.facebook.react.modules.netinfo.NetInfoModule' appears in /data/data/at.??????/files/instant-run/dex/slice-com.facebook.react-react-native-0.20.1_3762d580ab3ced1fa2f7503493d38e666994b9fa-classes.dex)
        at com.facebook.react.modules.netinfo.NetInfoModule.<init>(NetInfoModule.java:55)
        at com.facebook.react.shell.MainReactPackage.createNativeModules(MainReactPackage.java:67)
        at com.facebook.react.ReactInstanceManagerImpl.processPackage(ReactInstanceManagerImpl.java:793)
        at com.facebook.react.ReactInstanceManagerImpl.createReactContext(ReactInstanceManagerImpl.java:730)
        at com.facebook.react.ReactInstanceManagerImpl.access$600(ReactInstanceManagerImpl.java:91)
        at com.facebook.react.ReactInstanceManagerImpl$ReactContextInitAsyncTask.doInBackground(ReactInstanceManagerImpl.java:184)
        at com.facebook.react.ReactInstanceManagerImpl$ReactContextInitAsyncTask.doInBackground(ReactInstanceManagerImpl.java:169)
        at android.os.AsyncTask$2.call(AsyncTask.java:288)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
        at java.lang.Thread.run(Thread.java:818) 

【问题讨论】:

  • 尝试用最新版本替换 React-Native 依赖 compile "com.facebook.react:react-native:0.39" // From node_modules
  • 这个错误你解决了吗?

标签: android react-native react-native-android


【解决方案1】:

我怀疑这是由于 maven allprojects 配置中的错误路径导致 gradle 选择了错误版本的 react-native 引起的(至少对我们来说是这样) 在这里查看公关:https://github.com/facebook/react-native/pull/14743

【讨论】:

    【解决方案2】:

    我正在将现有的 Android 应用(使用 kotlin 编写)与 React Native 集成。

    我为运行 ReactRootView 而编写的活动 (.kt) 具有以下 onCreate() 方法:

     override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mReactRootView = ReactRootView(this)
            mReactInstanceManager = ReactInstanceManager.builder()
                    .setApplication(application)
                    .setBundleAssetName("index.android.bundle")
                    .setJSMainModuleName("index")
                    .addPackage(MainReactPackage())
                    .setUseDeveloperSupport(BuildConfig.DEBUG)
                    .setInitialLifecycleState((LifecycleState.RESUMED))
                    .build()
    
            // The string here (e.g. "MyReactNativeApp") has to match
            // the string in AppRegistry.registerComponent() in index.js
            mReactRootView!!.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null)
            setContentView(mReactRootView)
    
            if (Build.VERSION.SDK_INT >= M) {
                if (!canDrawOverlays(this)) {
                    val intent = Intent(ACTION_MANAGE_OVERLAY_PERMISSION,
                            Uri.parse("package:$packageName"))
                    startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE)
                }
            }
        }
    

    问题出在正题

    mReactRootView!!.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null).

    我不得不将“模块”名称从“MyReactNativeApp”更改为“App”,这是我在 React 上注册的主要组件的名称。

    import {AppRegistry} from 'react-native';
    import App from './App';
    import {name as appName} from './app.json';
    
    AppRegistry.registerComponent(appName, () => App);
    

    Sooo...正确的onCreate()函数是

     override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mReactRootView = ReactRootView(this)
            mReactInstanceManager = ReactInstanceManager.builder()
                    .setApplication(application)
                    .setBundleAssetName("index.android.bundle")
                    .setJSMainModuleName("index")
                    .addPackage(MainReactPackage())
                    .setUseDeveloperSupport(BuildConfig.DEBUG)
                    .setInitialLifecycleState((LifecycleState.RESUMED))
                    .build()
    
            // The string here (e.g. "MyReactNativeApp") has to match
            // the string in AppRegistry.registerComponent() in index.js
            mReactRootView!!.startReactApplication(mReactInstanceManager, "App", null)
            setContentView(mReactRootView)
    
            if (Build.VERSION.SDK_INT >= M) {
                if (!canDrawOverlays(this)) {
                    val intent = Intent(ACTION_MANAGE_OVERLAY_PERMISSION,
                            Uri.parse("package:$packageName"))
                    startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE)
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-01-01
      • 2018-08-29
      • 2017-05-02
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多