原生安卓项目集成ReactNative

参考文章地址:https://reactnative.cn/docs/integration-with-existing-apps

1、将上篇文章中ReactNative搭建好的AwesomeProjectXX项目添加到要集成的ReactNative安卓项目中


修改AwesomeProjectXX项目下的package.json文件

"name": "AwesomeProjectXX",

"version": "0.0.1",

"private": true,

"main": "index.js",

"scripts": {

"android": "react-native run-android",

  "ios": "react-native run-ios",

  "test": "jest",

  "lint": "eslint .",

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

2、在 app 中 build.gradle 文件中添加 React Native 依赖:


//添加implementation "com.facebook.react:react-native:+"

3、在项目的 build.gradle 文件中为 React Native 添加一个 maven 依赖的入口,必须写在 "allprojects" 代码块中:

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

4、接着,在 AndroidManifest.xml 清单文件中声明网络权限:

<uses-permission android:name="android.permission.INTERNET" />

如果需要访问 DevSettingsActivity 界面(即开发者菜单),则还需要在 AndroidManifest.xml 中声明:

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

5、创建一个index.js文件

首先在项目根目录中创建一个空的index.js文件。(注意在 0.49 版本之前是 index.android.js 文件)

index.js是 React Native 应用在 Android 上的入口文件。


import React,{Component} from'react';

import {

AppRegistry,

StyleSheet,

Text,

View

} from'react-native';

class HelloWorld extends React.Component {

render() {

return (

这是React-Native组件

)

}

}

var styles = StyleSheet.create({

container: {

flex:1,

justifyContent:'center',

backgroundColor:'#ccc',

},

hello: {

fontSize:20,

color:'#fff',

textAlign:'center',

margin:10,

},

});

AppRegistry.registerComponent('AwesomeProjectXX', () => HelloWorld);//这里的HelloWorld是要渲染的组件


6、在你android原生项目下重新新建一个类,我这里新建类名为MyReactActivity,作为加载React-Native控件。

package com.sunnyweather.reactnative;

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import com.facebook.react.ReactInstanceManager;

import com.facebook.react.ReactRootView;

import com.facebook.react.common.LifecycleState;

import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;

import com.facebook.react.shell.MainReactPackage;

public class MyReactActivityextends Activityimplements DefaultHardwareBackBtnHandler {

private ReactRootViewmReactRootView;

    private ReactInstanceManagermReactInstanceManager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        //setContentView(R.layout.myreactdemo);

        mReactRootView =new ReactRootView(this);

        mReactInstanceManager = ReactInstanceManager.builder()

.setApplication(getApplication())

.setCurrentActivity(this)

.setBundleAssetName("index.android.bundle")

.setJSMainModulePath("index")

.addPackage(new MainReactPackage())

.setUseDeveloperSupport(BuildConfig.DEBUG)

.setInitialLifecycleState(LifecycleState.RESUMED)

.build();

        //reactdemo这个名字要与package.json、以及react-native中index.android.js中的项目名要一致,否则会出错。

        mReactRootView.startReactApplication(mReactInstanceManager, "AwesomeProjectXX", null);

        setContentView(mReactRootView);

    }

@Override

    public void invokeDefaultOnBackPressed() {

super.onBackPressed();

    }

@Override

    protected void onResume() {

super.onResume();

        if (mReactInstanceManager !=null) {

//mReactInstanceManager.onHostResume(this, this);

        }

}

@Override

    protected void onPause() {

super.onPause();

        if (mReactInstanceManager !=null) {

mReactInstanceManager.onHostPause(MyReactActivity.this);

        }

}

@Override

    protected void onDestroy() {

super.onDestroy();

        if (mReactInstanceManager !=null) {

mReactInstanceManager.onHostDestroy(MyReactActivity.this);

        }

}

@Override

    public void onBackPressed() {

if (mReactInstanceManager !=null) {

mReactInstanceManager.onBackPressed();

        }else {

super.onBackPressed();

        }

}

@Override

    public boolean onKeyUp(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_MENU &&mReactInstanceManager !=null) {

mReactInstanceManager.showDevOptionsDialog();

return true;

        }

return super.onKeyUp(keyCode, event);

    }

}


修改AndroidManifest.xml配置文件

7、在app下的MainActivity活动中添加跳转功能

在activity_main.xml中添加一个跳转的按钮,用于跳转到MyReactActivity活动页面。

8、AwesomeProjectXX项目下的MainActivity.java文件

创建的index.js中的return "AwesomeProjectXX",要与index.js的AppRegistry.registerComponent('AwesomeProjectXX', () => HelloWorld);中的第一个参数相一致

9、运行调试

(1)命令窗口启动服务器:E:\GitHubWorkspace\ReactNative\app\AwesomeProjectXX>npx react-native start

(2)真机运行:

服务器启动验证

10、问题集锦

(1)解决 couldn't find DSO to load: libhermes.so 问题

1)在app的build.gradle中添加:


if (enableHermes) {

implementation project(':hermes-engine')

debugImplementation files(hermesPath +"hermes-debug.aar")

releaseImplementation files(hermesPath +"hermes-release.aar")

}else {

implementation jscFlavor

}


project.ext.react = [

enableHermes:false,

]

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

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


if (enableHermes) {

implementation project(':hermes-engine')

debugImplementation files(hermesPath +"hermes-debug.aar")

releaseImplementation files(hermesPath +"hermes-release.aar")

}else {

implementation jscFlavor

}if (enableHermes) {

implementation project(':hermes-engine')

debugImplementation files(hermesPath +"hermes-debug.aar")

releaseImplementation files(hermesPath +"hermes-release.aar")

}else {

implementation jscFlavor

}

2)在外部的build.gradle中添加:

3)在外部的setting gradle中添加:

include':hermes-engine'

project(':hermes-engine').projectDir =new File(rootProject.projectDir,'../node_modules/hermes-engine/android/')

(2)react native Unable to download JS bundle 的解决方案

在真机或模拟器中没设好IP,将IP设好:

E:\GitHubWorkspace\ReactNative\app\AwesomeProjectXX>adb reverse tcp:8081 tcp:8081

(3)未找到index.android.bundle文件

解决:创建android/app/src/main/assets文件夹,在cmd命令中执行react-native bundle --platform android --dev false --entry-file index.js --bundle-output ../plugin/tmp/bundle/index.android.bundle --assets -dest ../plugin/tmp/bundle ,其中index.js就是入口文件,再重新执行react-native run-android,执行完成后就会出现如下的文件

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