参考文章地址: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 依赖:
3、在项目的 build.gradle 文件中为 React Native 添加一个 maven 依赖的入口,必须写在 "allprojects" 代码块中:
4、接着,在 AndroidManifest.xml 清单文件中声明网络权限:
如果需要访问 DevSettingsActivity 界面(即开发者菜单),则还需要在 AndroidManifest.xml 中声明:
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,执行完成后就会出现如下的文件