官方文檔: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