RN入门---环境搭建和第一个RN项目

一、RN环境的搭建,参照RN中文网,有以下概念

Chocolatey:Chocolatey是一个Windows上的包管理器,用于安装windows程序
Python 2
NodeJS:NodeJS是基于javascript的服务端。将本地的js文件(RN里,将返回的js文件通过依赖React翻译成React格式,再通过依赖react-native,翻译为react-native格式)返回客户端(即android端)。
bundle文件:react-native格式的js文件(react-native格式的js代码可以说是一个转换器,在nodejs端可以依赖react-native插件对应js代码,在android可以依赖react-native插件对应java代码,react-native插件是翻译官)是放在bundle文件内的,android端是和它交互的。当android端和nodejs端离线时,放在assets目录下;服务端启动时,直接返回bundle文件。android端一个RN界面从bundle中拿取当前界面需要的内容(如下图),并依赖react-native插件将这些内容映射为原生视图和事件处理。
android端一个RN页面需要的内容如下,需要和NodeJS端的主js文件导出的组件名一致(可以理解为将此页面的所有内容打包到这个名字下了):
android:
这里写图片描述
Js:
这里写图片描述
react-native-cli:相当于node.js的一个插件,相当于nodejs的一个入口。两个作用:1.初始化出一个带有支持RN组件的android Demo工程,2.该插件的作用还有当node.js服务启动后,当native端的APP发起JS请求时,检查服务端的js信息是否有更新,并将它们转化为react-native格式传给native端。
npm:node packege manage,node包管理器,负责nodejs的模块安装。装nodejs时,npm就已经自动安装好了。


二、当直接initRN项目时

很简单,直接调用”react-native init”命令即可。会从相关的远程copy配置好的工程目录层次到本地。


三、当将原生集成RN时:

这里写图片描述
NodeJS端环境
1、将原生工程放入android文件夹内
2、在根目录下新建packege.json文件,填入以下内容(也可通过“npm init”命令实现),类似gradle配置文件:
这里写图片描述
version字段没有太大意义(除非你要把你的项目发布到npm仓库)。scripts中是用于启动packager服务的命令。dependencies中的react和react-native的版本取决于你的具体需求。一般来说我们推荐使用最新版本。你可以使用npm info react和npm info react-native来查看当前的最新版本。另外,react-native对react的版本有严格要求,高于或低于某个范围都不可以。
3、执行“npm install”命令安装后,就会生成”node_moudles”文件夹。

Android端环境
1、在你的app中 build.gradle 文件中添加 React Native 依赖:
这里写图片描述
2、为确保android端和nodejs端react-native版本一致,在项目的 build.gradle 文件中为 React Native 添加一个 maven 依赖的入口,必须写在 “allprojects” 代码块中:
这里写图片描述
3、因为要和nodejs端交互,添加网络权限
这里写图片描述
4、如果需要访问 DevSettingsActivity 界面(即开发者菜单),则还需要在 AndroidManifest.xml 中声明,开发者菜单一般仅用于在开发时从Packager服务器刷新JavaScript代码,所以在正式发布时你可以去掉这一权限。
这里写图片描述

android端代码
一个rn界面:

//该Activity不用直接继承ReactActivity,但是实现DefaultHardwareBackBtnHandler接口,以处理相关的手机按键事件
public class RNSceActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {

private static final int OVERLAY_PERMISSION_REQ_CODE = 102;
private static final String TAG = "---";
private ReactRootView mReactRootView;//JS对应的Native的根布局
private ReactInstanceManager mReactInstanceManager;//Instance 管理器

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main); //RN中不需要此处填充view 使用解析到的JS端的view填充
    initRNRootView();//初始化RN的rootView,所有解析到的view都按规则添加到该View上
    //打开悬浮窗(overlay)权限
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
        }
    }
}

private void initRNRootView() {
    mReactRootView = new ReactRootView(this);
    mReactInstanceManager = ReactInstanceManager.builder().setApplication(getApplication())
            .setBundleAssetName("index.android.jsbundle")//main.jsbundle
            .setJSMainModuleName("index.android")//index.android
            .addPackage(new MainReactPackage())
            .setUseDeveloperSupport(BuildConfig.DEBUG)//BuildConfig.DEBUG 直接用debug 出现crash ---http://blog.csdn.net/guxiao1201/article/details/50899136
            .setInitialLifecycleState(LifecycleState.RESUMED)
            .build();
    mReactRootView.startReactApplication(mReactInstanceManager, "RNFirstComponent", null);
    setContentView(mReactRootView);
}

@Override
public void invokeDefaultOnBackPressed() {
    super.onBackPressed();
}

@Override
protected void onPause() {
    super.onPause();
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onHostPause();
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onHostResume(this, this);
    }
}

@Override
public void onBackPressed() {
    if (mReactInstanceManager != null) {
        mReactInstanceManager.onBackPressed();
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (mReactInstanceManager != null && keyCode == KeyEvent.KEYCODE_MENU) {
        mReactInstanceManager.showDevOptionsDialog();
        return true;
    }
    return super.onKeyUp(keyCode, event);
}
//打开悬浮窗(overlay)权限
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (!Settings.canDrawOverlays(this)) {
                // SYSTEM_ALERT_WINDOW permission not granted...
                Log.d(TAG, "onActivityResult: ");
            }
        }
    }
}
}

需要把其中一段代码拿出来说:
这里写图片描述

js端代码

import React from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class HelloWorld extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.hello}>Hello, World</Text>
      </View>
    )
  }
}
var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  },
  hello: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

AppRegistry.registerComponent('RNFirstComponent', () => HelloWorld);//名字必须和上图android端请求的一致

四、另:

1、当nodejs服务端启动不起来时,停留在下图所示:
这里写图片描述
此时需要通过命令行生成离线bundle。

2、 手动生成bundle文件,需要我们执行如下命令:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/

这里写图片描述

3、React Native项目在64位Android手机上运行,会提示
“/data/data/com.xxx.xxx/lib-main/libgnustl_shared.so” is 32-bit instead of 64-bit 这个错误。
解决方法就是取消掉所有的64位的.so文件,全部加载32位的就可以了,下面是步骤
a、在项目的根目录的 gradle.properties 里面添加一行代码 android.useDeprecatedNdk=true.
b、在 build.gradle 文件里添加以下代码

android {  
    ...  
    defaultConfig {  
        ...  
        ndk {  
            abiFilters "armeabi-v7a", "x86"  
        }  

        packagingOptions {  
            exclude "lib/arm64-v8a/librealm-jni.so"  
        }  
    }  
}  

4、可以通过数据线和服务端连接即时拿取bundle文件;也可通过wifi和服务端连接即时拿取bundle文件(要求手机和电脑在同一个wifi下);也可以通过命令直接生成离线bundle。

5、服务端执行npm start 窗口会显示打包bundle的进度如下
这里写图片描述


五、参考:

http://reactnative.cn/docs/0.50/integration-with-existing-apps.html#content
http://blog.csdn.net/chichengjunma/article/details/53815299
http://m.blog.csdn.net/M075097/article/details/76551415

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RN8302B是一款电表芯片,它是由瑞萨电子公司生产的一款高精度电能表芯片。该芯片通过测量电流、电压等参数来计算电能消耗量,并具有高准确性和稳定性。 RN8302B电表芯片内部集成了ADC(模数转换器)、DSP(数字信号处理器)、存储器和通信接口等模块。它能够对电流和电压进行高精度采样,并且能够根据采样数据进行计算。芯片的内部DSP模块则负责对采样数据进行处理和分析,以得出准确的电能消耗量。 该芯片具备可编程功能,可以通过外部接口进行程序配置。用户可以根据需要,对芯片的功能进行自定义设置,比如设置显示方式、报警功能等。此外,RN8302B还支持多种通信接口,如UART、SPI和I2C等,可以与其他设备进行数据交互,实现远程读取和控制。 在应用上,RN8302B广泛应用于电能计量领域。它可用于住宅小区、工业企业、商业建筑等各种场所的电能计量系统。该芯片能够提供精确的电能消耗数据,有助于用户监测电能使用情况并进行节能管理。同时,由于其高精度和可靠性,RN8302B也被许多电力公司选择作为电能计量的标准芯片。 总之,RN8302B电表芯片是一款集成了高精度ADC、DSP和通信接口等功能的电能表芯片。它具有高精度、稳定性和可编程的特点,并被广泛应用于电能计量系统中。 ### 回答2: RN8302B是一款电表芯片,具备高精度、高集成度和低功耗的特点。该芯片主要用于电能表的设计与制造,可应用于各种类型的电表,如民用电表、工业电表等。 RN8302B芯片的程序设计是为了实现电能测量和数据处理功能。其程序结构包括系统初始化、数据采集、数据处理和通信等模块。 在系统初始化模块中,芯片需要进行硬件初始化、寄存器配置和参数设置等操作,以确保芯片正常工作。 在数据采集模块中,芯片通过内部ADC(模数转换器)采集电流、电压和功率因数等数据,并实时进行转换和存储。 在数据处理模块中,芯片会对采集到的原始数据进行滤波、运算和校正等处理,以得到准确的电能测量结果。同时,芯片还具备多项算法,如功率因数校正算法和反向电流检测算法,以提高测量的准确性和可靠性。 最后,在通信模块中,芯片支持多种通信接口,如UART(串口)、SPI(串行外设接口)和I2C(串行总线接口),以实现与外部设备的数据交互和远程通信功能。 总体而言,RN8302B电表芯片程序的设计旨在优化电能测量和数据处理的效果,提供稳定、准确和可靠的电能测量解决方案。 ### 回答3: RN8302B是一款集成电表芯片,用于电能计量和电力质量分析。它具有高精度和高性能的特点,适用于各种计量和监控场景。 RN8302B的程序主要包括以下几个方面: 1. 电能计量:RN8302B能够测量电网上电压、电流、功率等参数,并计算出电能的值。通过内部的AD转换器和数字处理器,可以实时监测电网的用电情况,并提供精确的电能计量功能。 2. 电流采样:RN8302B能够进行电流采样,对采样结果进行处理以得到更精确的电能值。电流采样可以通过直接接入电流互感器或者使用专用的电流传感器实现,保证了电能计量的准确性。 3. 数据通信:RN8302B支持多种数据通信方式,包括UART通信、SPI通信等。用户可以通过这些通信接口与RN8302B进行数据交互,实现数据读取、参数设置等功能。 4. 电力质量分析:RN8302B内置了多种电力质量分析算法,可以对电网的电压、电流波形进行分析,检测电力质量问题,如电压谐波、电流不平衡等。通过精确的电力质量分析,可以帮助用户及时发现和解决电网中的问题。 总之,RN8302B是一款功能强大的电表芯片。它不仅能够实现电能计量功能,还可以进行电流采样、数据通信和电力质量分析等操作。通过RN8302B,用户可以得到电能计量和电力质量方面的准确数据,为实现节能和优化电力系统提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值