React-native Android:调用 AppRegistry.runApplication 时出错

Posted

技术标签:

【中文标题】React-native Android:调用 AppRegistry.runApplication 时出错【英文标题】:React-native Android: Error calling AppRegistry.runApplication 【发布时间】:2017-10-02 06:21:02 【问题描述】:

我真的不知道这里发生了什么。 我设置了一个基本应用程序并使用了here 找到的代码共享方法。 这都是非常基本的,所以这里是代码:

// index.android.js
// index.ios.js
import React,  AppRegistry  from 'react-native';
import CompetitionAgent from './app/index';

AppRegistry.registerComponent('CompetitionAgent', () => CompetitionAgent);

还有组件:

//./app/index.js
import React,  Component  from 'react';
import 
    StyleSheet,
    Text,
    TextInput,
    View
 from 'react-native';

export default class CompetitionAgent extends Component 
    constructor() 
        super();
        this.state = nickname:'';
    
    render() 
        return (
            <View style=styles.container>
                <View style=styles.information>
                    <Text style=styles.welcome>
                        Welcome to the Competition Agent Connect app!
                    </Text>
                    <Text style=styles.instructions>
                        When you are near a Competition Agent, you can join the session.
                    </Text>
                </View>
                <View style=padding:10>
                    <TextInput style=styles.inputStyle />
                </View>
            </View>
        );
    


const styles = StyleSheet.create(
    container: 
        flex: 1,
        justifyContent: 'center',
    ,
    information: 
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    ,
    welcome: 
        fontSize: 20,
        textAlign: 'center',
        margin: 10,
    ,
    instructions: 
        textAlign: 'center',
        color: '#333333',
        marginBottom: 5,
    ,
    inputStyle: 
        flexDirection: 'row',
        backgroundColor: '#3E3134',
        color: '#FFFFFF',
    
);

我知道错误可能有很多。所以这个基本布局会产生同样的错误。

import React,  Component  from 'react';
import 
    StyleSheet,
    Text,
    TextInput,
    View
 from 'react-native';

export default class CompetitionAgent extends Component 
    constructor() 
        super();
        this.state = nickname:'';
    
    render() 
        return (
            <View style=styles.container>
                <Text style=styles.information>
                    Welcome to the Competition Agent Connect app!
                </Text>
            </View>
        );
    


const styles = StyleSheet.create(
    container: 
        flex: 1,
        justifyContent: 'center',
    ,
    information: 
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    
);

堆栈跟踪:

E/unknown:React: Exception in native call
                                              java.lang.RuntimeException: Error calling AppRegistry.runApplication
                                                  at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
                                                  at android.os.Handler.handleCallback(Handler.java:739)
                                                  at android.os.Handler.dispatchMessage(Handler.java:95)
                                                  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
                                                  at android.os.Looper.loop(Looper.java:158)
                                                  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208)
                                                  at java.lang.Thread.run(Thread.java:818)
                                               Caused by: com.facebook.jni.CppException: Could not get BatchedBridge, make sure your bundle is packaged correctly
                                                  at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method) 
                                                  at android.os.Handler.handleCallback(Handler.java:739) 
                                                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31) 
                                                  at android.os.Looper.loop(Looper.java:158) 
                                                  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208) 
                                                  at java.lang.Thread.run(Thread.java:818) 

昨天运行良好,重启 Android Studio 也没有帮助。

【问题讨论】:

【参考方案1】:

我最近在 Genymotion 模拟器中运行第二个 React Native 项目时遇到了同样的问题,我得到了红屏并显示错误提示:

调用 AppRegistry.runApplication 时出错

但是,就我而言,这不是由于缺少这些环境变量引起的,因为我在一开始就添加了它们。 adb reverse tcp:8081 tcp:8081 命令对我也不起作用。我尝试了几乎所有可以在 Internet 上找到的解决方案,但都没有奏效。

在我的情况下,解决方案是设置Debug Server主机和端口,如下图:

CTRL + M,打开设置覆盖

点击“Dev Settings”,进入设置菜单

点击“Debug Server host & port for device”,然后在弹出窗口中输入localhost:8081

现在你可以重新加载它,它应该开始工作了。

希望这个解决方案可以帮助一些人。

背景:

实际上,在 Windows 7 Pro 上设置我的开发环境后,当我运行我的第一个 React Native 应用程序时,我收到一条错误消息:

无法从资产“index.android.bundle”加载脚本。确保 您的捆绑包已正确打包,或者您正在运行一个包 服务器。

为了解决这个问题,我将 Debug Server 选项设置为 localhost:8081,我希望该设置会在虚拟设备上全局生效。但它似乎对每个应用程序都有效,这意味着我必须为新的 React Native 项目一遍又一遍地设置它。

我还在 Windows 10 Home 上设置了环境(遵循与在 Windows 7 Pro 上完全相同的程序),无需设置调试服务器选项,它不会给我这样的错误,我可以运行任何React Native 项目而不进行任何设置。

【讨论】:

需要注意的是localhost:8081是模拟器设置,&lt;ip-address&gt;:8081是Wi-Fi设备设置;) 这可能就是adb reverse tcp:8081 tcp:8081 没有为你改变任何东西的原因,因为如果你在模拟器上运行,没有什么可以逆转的,因为模拟器已经指向本地主机 是的,我使用 Genymotion 而不是真正的 Android 设备。感谢您指出这一点。【参考方案2】:

我遇到了类似的问题。尝试让它在设备上运行时,我会收到此错误。它在我电脑上的模拟器上运行良好。

问题是当我执行adb devicesreact-native run-android 时,我会得到“ADB 未被识别为内部或外部命令”。

所以我的解决方法是将 adb.exe 的父目录的路径添加到我的环境变量中,然后重新启动我的命令提示符。在我这样做之后,adb devices 不会抛出“无法识别的内部外部废话”,它会列出我的设备。然后我运行react-native run-android 并在启动时不再出现红屏显示完全无用的错误消息Error calling AppRegistry.runApplication! :)

所以我发现 ADB 位于我的文件夹中:

C:\Users\Noitidart\AppData\Local\Android\sdk\platform-tools\adb.exe

我使用的是 Windows 10 系统。 Noitidart 是我的计算机用户名。

所以我去了系统环境变量然后找到“路径”然后单击“编辑”,然后单击“新建”并添加到“C:\Users\Mercurius\AppData\Local\Android\sdk\platform-tools”。这是截图:

【讨论】:

非常有帮助,谢谢。但是,我的路径设置正确,否则我无法从一开始就部署到我的设备:) 非常感谢@DerpyNerd 的友好评论和+1 :)【参考方案3】:

当我为

设置正确的路径时,它对我有帮助
ANDROID_HOME = C:\Users\username\AppData\Local\Android\sdk

和工具:

%ANDROID_HOME%\build-tools
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools

【讨论】:

这是有用的信息,但您是否收到相同的错误消息?这似乎很奇怪,因为这个错误只在我运行我的应用程序时出现。这意味着该应用程序过去已成功构建和捆绑。如果没有正确链接 SDK 和工具,您就无法成功构建,还是我错了? 我有一个“BUILD SUCCESSFUL”消息,虽然也有“java.lang.RuntimeException: Error calling AppRegistry.runApplication”当我正确设置路径时它已经消失了。顺便说一句,我只有 ANDROID_HOME 的路径,但没有工具。 为了构建,您必须设置所有路径,如描述的 lvts,您是否运行了打包程序?设备必须能够连接到打包程序才能运行您刚刚构建的代码【参考方案4】:

如果您从 Android Studio 运行您的应用程序,那么您必须使用您的 react 项目文件夹中的 react-native start 从命令行启动 react-native 打包程序。

您还必须使用 adb reverse tcp:8081 tcp:8081 设置 Android 端口转发。

你做到了吗?

【讨论】:

我会试试看的。我的 Mac 从昨天开始就处于待机状态,一切正常……我对 Mac 或打包程序不太熟悉。我想我有一些事情要弄清楚。 看看这是否适合你。 react 打包器偶尔会自行死机,因此必须重新启动。 吸取的教训并记录下来。启动打包程序并设置端口转发,它再次运行...谢谢 很高兴听到它有效。对于它的价值,如果您从命令行使用 react-native run-android(而不是从 Android Studio)启动您的应用程序,那么它应该启动打包程序并为您进行端口转发。但它还有其他问题有时会阻止它启动... 发布 apk 也会出现这种情况吗?

以上是关于React-native Android:调用 AppRegistry.runApplication 时出错的主要内容,如果未能解决你的问题,请参考以下文章

在android中安排后台任务并从任务中调用react-native javascript方法

react-native 跳转到ios/android 权限设置界面

在react-native中,我如何在ios和android的图像上添加水印

react-native android/ios 手动/自动 修改版本号

React-Native 开发 android & ios App,共享一份代码

[react-native]Getting Started for Android on Windows