官方文档:https://reactnative.cn/docs/native-modules-android/
RN调用原生的方法,步骤以下:java
1.用Android Studio打开一个已存在的项目,在RN项目中选择android/build.gradle文件打开。react
2.在Android原生的里面建立一个类MyNativeModule继承ReactContextBaseJavaModule,
这个类里面放被rn调用的方法,封装成了一个原生模块。android
3.在Android原生的里面建立一个类MyReactPackage实现接口ReactPackage包管理器,并把
第2步建立的类MyNativeModule的对象加到createNativeModules方法的列表的返回值里面git
4.将第3步建立的包管理器MyReactPackage对象添加到MainApplication中的getPackages方法的数组里 面github
5.在RN中调用原生模块 NativeModules.MyNativeModule.myToast(“翟浩浩”);
注意引入
import {NativeModules} from ‘react-native’;shell
RN项目结构:react-native
用Android Studio在RN项目中选择android/build.gradle文件打开。数组
根据上面的步骤来写:
1在Android原生的里面建立一个类MyNativeModule继承ReactContextBaseJavaModule,
这个类里面放被rn调用的方法,封装成了一个原生模块。app
package com.dys02;ide
import android.content.Context;
import android.widget.Toast;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import javax.annotation.Nonnull;
/**
* 本身封装的原生模块
*/
public class MyNativeModule extends ReactContextBaseJavaModule {
private Context context;
public MyNativeModule(@Nonnull ReactApplicationContext reactContext) {
super(reactContext);
context = reactContext;
}
/**
* 这个方法只能返回类名
*/
@Nonnull
@Override
public String getName() {
// 这里必须是类名
return "MyNativeModule";
}
/**
* 本身定义的方法,注意这里不能有返回值
* 只写一个吐丝测试一下
*/
@ReactMethod
public void myToast(String msg) {
Toast.makeText(context, "" + msg, Toast.LENGTH_SHORT).show();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2在Android原生的里面建立一个类MyReactPackage实现接口ReactPackage包管理器,并把
类MyNativeModule的对象加到createNativeModules方法的列表的返回值里面
package com.dys02;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
/**
* 把原生模块 MyNativeModule 放到列表里
*/
public class MyReactPackage implements ReactPackage{
@Nonnull
@Override
public List<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
List <NativeModule> modules = new ArrayList<>();
modules.add(new MyNativeModule(reactContext));
return modules;
}
@Nonnull
@Override
public List<ViewManager> createViewManagers(@Nonnull ReactApplicationContext reactContext) {
return null;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
3.将MyReactPackage对象添加到MainApplication中的getPackages方法的数组里面
package com.dys02;
import android.app.Application;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;
import java.util.Arrays;
import java.util.List;
public class MainApplication extends Application implements ReactApplication {
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
public boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG;
}
/**
* 把 MyReactPackage ,放到数组里,供rn调用
* @return
*/
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new MyReactPackage()
);
}
@Override
protected String getJSMainModuleName() {
return "index";
}
};
@Override
public ReactNativeHost getReactNativeHost() {
return mReactNativeHost;
}
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
4在RN中调用原生模块 NativeModules.MyNativeModule.myToast(“翟浩浩”);
注意引入
import {NativeModules} from ‘react-native’;
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow
*/
import React, {Component} from 'react';
import {Platform, StyleSheet, Text,NativeModules, View} from 'react-native';
type Props = {};
export default class App extends Component<Props> {
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome} onPress={() => this.iClick()}>调用原生代码!</Text>
<Text style={styles.instructions}>To get started, edit App.js</Text>
</View>
);
}
//点击事件
iClick = () => {
NativeModules.MyNativeModule.myToast("翟浩浩");
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
源码下载:
https://download.csdn.net/download/zhaihaohao1/11055183
有 0 我的打赏 ———————————————— 版权声明:本文为CSDN博主「zhaihaohao1」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处连接及本声明。 原文连接:https://blog.csdn.net/zhaihaohao1/article/details/88775506