【原】React Native嵌入到现有原生应用(一)

本篇主要介绍在开发模式下运行测试程序。

1、创建Android原生应用工程HelloAS

2、在HelloAS工程的根目录中,安装react-native,这时候会创建一个node_modules/

的目录

npm init

注意:init命令需记住name参数,且命名均使用小写字母
init命令,需要填写诸如name、version等参数,输入后按回车接着输入下一个参数。init之后会在根目录生成package.json文件。其中name是react native的工程名(示例工程名为“helloas”),在后面的index.android.js和ReactNativeActivity里都要用到。其它的都可以回车使用默认值。

package.json

3、创建js文件

npm install --save react
npm install --save react-native

注意,因国内网络的问题,我将react-native-0.40.0.tgz下载到工程根目录中。所以在package.json中react-native访问了是本地的file

4、在根目录创建.flowconfig文件

curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig

在windows环境下,没有curl命令,可以直接用浏览器打开https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig ,将显示的内容直接保存到.flowconfig文件

5、打开package.json文件,在“scripts”内添加如下语句

"start": "node node_modules/react-native/local-cli/cli.js start"

6、在根目录中创建index.android.js,将如下内容粘贴到文件中

'use strict';
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('helloas', () => HelloWorld);

注意,最后一句AppRegistry.registerComponent,第一个参数是前面package.json里设置的name,第二个参数是自定义的component。

7、在app的build.gradle中添加React Native的编译依赖

dependencies { 
    ... 
    compile "com.facebook.react:react-native:+" // From node_modules. 
}

8、在project的build.gradle中添加本地的React Native的marven目录

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

9、在AndroidManifest中添加如下的权限

<uses-permission android:name="android.permission.INTERNET"/>
/**设置调试 的权限**/
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

10、在AndroidManifest的Application节点,添加如下Activity

<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />

注意,该Activity仅在开发模式从开发服务器reload js时使用,所以在release模式下可精简。
index.android.js就是hello world界面。手机在debug模式下从自己的计算机下载index页面。下载的过程会有个提示的dialog,显示它需要上面的权限。6.0及以上的系统,除了在Manifest里授权,还需要在系统设置里的“应用-》在其他应用的上层显示”里,找到我们的应用,勾选上允许。不同厂家的设置不太一样,华为手机截图如下:

20170111163633851681.png

11、添加原生代码

onCreate部分代码如下,其余参考react native中文网。
注意,mReactRootView.startReactApplication()的第二个参数,必须是package.json里的name

Paste_Image.png

12、在项目的根目录下,运行代码,启动测试服务器

npm start
//或者
react-native start

运行截图如下:

Paste_Image.png

13、进入Android Studio,运行程序

注意,如果要运行在真机上,要注意在设备上运行的相关事项是否已经做过。我的测试机是android 6.0系统,那每次连上usb,都需要先命令行执行一次:

adb reverse tcp:8081 tcp:8081

然后再运行app,否则手机无法连上测试服务器,会出现“红屏”(添加了DevSettingsActivity的情况下)。同样,如果测试服务器没有开启,也会出现错误。

64位真机运行react native的坑

运行时出现如下crash

java.lang.UnsatisfiedLinkError: dlopen failed: "xxx/libgnustl_shared.so" is 32-bit instead of 64-bit
解决方案

1、在项目的根目录的 gradle.properties里面添加一行代码

android.useDeprecatedNdk=true.

2、在project的root目录下的build.gradle中添加如下代码。

defaultConfig { 
    ···
    ndk{ 
        abiFilters "armeabi-v7a","x86" 
    } 
    packagingOptions { 
        exclude "lib/arm64-v8a/librealm-jni.so" 
    } 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容