react-native连接android原生模块

news2024/11/14 13:44:16

目录

搭建react-native项目

搭建node和jdk的环境

搭建Android的环境

创建React-native项目

运行react-native项目

下载夜神模拟器

使用adb连接夜神浏览器。

运行react-native项目

编写原生安卓的apk

android studio中编写原生代码

在React-native编写代码。


  1. 搭建react-native项目

    1. 搭建node和jdk的环境

      软件版本号测试版本命令
      node20.16.0node -version
      jdk21.0.4javac -version

      java的jdk版本(也就是java的环境),可以在以下网站进行下载。https://www.oracle.com/java/technologies/downloads/#java17
      输入javac -version有结果返回才算成功。
       

    2. 搭建Android的环境

      1. 注意:记得这一步要有稳定的代理软件,不然后面的步骤都走不下去

      2. 安装 android studio。可以通过这个网站进行下载: android studio下载链接 安装界面中选择"Custom"选项,确保选中了以下几项:

        配置
        Android SDK
        Android SDK Platform
        Android Virtual Device

        如果选择框是灰的,你也可以先跳过,稍后再来安装这些组件。

      3. 安装SDK,Android Studio 默认会安装最新版本的 Android SDK。一些Android Studio的样式是新UI,可以先设置为旧样式。

      4. 开始管理SDK。

        在 SDK Manager 中选择"SDK Platforms"选项卡,然后在右下角勾选"Show Package Details"。展开 Android 14 (UpsideDownCake) 选项,确保勾选了下面这些组件(如果你看不到这个界面,则需要使用稳定的代理软件):

        Android SDK Platform 34
        Intel x86 Atom_64 System Image(官方模拟器镜像文件,使用非官方模拟器不需要安装此组件,我使用的是夜神模拟器,所以不用配)



        然后点击"SDK Tools"选项卡,同样勾中右下角的"Show Package Details"。展开"Android SDK Build-Tools"选项,确保选中了 React Native 所必须的34.0.0版本。你可以同时安装多个其他版本。

        最后点击"Apply"来下载和安装这些组件。

      5. 通过android studio的下载的sdk可以通过下面图的图纸,进行设置位置。

      6. 设置Android_Home的环境变量。我们打开通过android studio生成的sdk的目录。

      7. 加入ANDROID_HOME的配置。设置属性:ANDROID_HOME为D:\environment_software\sdk·

      8. 加入工具目录到path里面去。

        %ANDROID_HOME%\platform-tools
        %ANDROID_HOME%\tools\bin
        %ANDROID_HOME%\tools
        %ANDROID_HOME%\emulator


    3. 创建React-native项目

      1. 如果你之前全局安装过旧的react-native-cli命令行工具,请使用npm uninstall -g react-native-cli卸载掉它以避免一些冲突:

        npm uninstall -g react-native-cli @react-native-community/cli
         
      2. 使用命令创建react-native项目

        npx @react-native-community/cli@latest init AwesomeProject
         
      3. 下载完是下面这个图:
  2. 运行react-native项目

    1. 下载夜神模拟器

      1. 下载地址: 夜神安卓模拟器-手游模拟器电脑版_夜神模拟器官网
      2. 启动夜神模拟器。
    2. 使用adb连接夜神浏览器。

      1. 配置环境变量:有配置这个目录就可以了。
      2. 输入命令: adb connect 127.0.0.1:62001
      3. 执行 npm run android
      4. 会出现以下的错误。(Unable to open connection to ADB server: java.io.IOException: Can't find adb server on port 5037, IPv4 attempt: Connection refused: connect, IPv6 attempt: Connection refused: connect)
      5. 解决方案:
        1. 到SDK的目录下。复制3个文件。下面需要复制到夜神模拟器的目录中去。
        2. 到夜神模拟器的文件夹。可以在菜单下输入“夜神模拟器”,右键打开文件位置。
        3. 覆盖文件。
        4. 然后在sdk目录下,复制一份adb.exe,并重命名为nox_adb.exe。
        5. 也拷贝到夜神模拟器的目录下。
        6. 重新启动夜神,在拷贝文件过程中,也需要先关闭夜神模拟器,不然文件不让覆盖。
    3. 运行react-native项目

      1. 在vscode输入 adb connect 127.0.0.1:62001,然后输入 npm run android命令。

      2. 夜神模拟器的界面效果。
      3. 修改代码,查看是否变化。
      4. 可以看到代码确实的变化了。
  3. 编写原生安卓的apk

    1. android studio中编写原生代码

      1. 我们使用android studio进行编写代码,有一些代码可以进行提示。

      2. 使用androiid studio打开rn项目的android文件夹。

      3. 使用android studio的file下的open。

      4. 点击自动下载依赖。
      5. 下载成功后的目录是这样的。
      6. 在app下的java的com.facebook.react目录下新建一个 CalendarModule.java 文件。
      7. 在上面那个目录右键,点击New,点击Java class。
      8. 加入名字 CalendarModule。
      9. 加入代码。
        package com.your-apps-package-name; // replace your-apps-package-name with your app’s import com.facebook.react.bridge.NativeModule;
        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 java.util.Map;
        import java.util.HashMap;
        
        public class MyAppPackage implements ReactPackage {
        
            @Override
            public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
                return Collections.emptyList();
            }
        
            @Override
            public List<NativeModule> createNativeModules(
                    ReactApplicationContext reactContext) {
                List<NativeModule> modules = new ArrayList<>();
        
                modules.add(new CalendarModule(reactContext));
        
                return modules;
            }
        
        }
      10. 在com.facebook.react新建一个MyAppPackage.java文件。
      11. MyAppPackage的文件修改成以下内容。
        package com.facebook.react;
        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.Collections;
        import java.util.List;
        
        public class MyAppPackage implements ReactPackage {
        
            @Override
            public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
                return Collections.emptyList();
            }
        
            @Override
            public List<NativeModule> createNativeModules(
                    ReactApplicationContext reactContext) {
                List<NativeModule> modules = new ArrayList<>();
        
                modules.add(new CalendarModule(reactContext));
        
                return modules;
            }
        
        }
        
      12. 要注册CalendarModule包,你必须将MyAppPackage添加到 ReactNativeHost 的getPackages()方法返回的包列表中。打开MainApplication.javaMainApplication.kt文件,位于如下路径:android/app/src/main/java/com/your-app-name/

        找到 ReactNativeHost 的getPackages()方法,并将你的包添加到getPackages()返回的包列表中。如下面图:

      13. 在19行加入内容。add(MyAppPackage())
    2. 在React-native编写代码。

      1. 导入文件

        import {NativeModules} from 'react-native';
        const {CalendarModule} = NativeModules;
        
      2. 加入一个按钮,并且触发Modules的方法。
        import {Button, NativeModules} from 'react-native';
        const {CalendarModule} = NativeModules;
        function onPress() {
          CalendarModule.createCalendarEvent('testName', 'testLocation');
        }
        
        <Button onPress={onPress} title='按钮'></Button>
      3. 代码截图如下:
      4. 重新执行 npm run android。可以看到按钮出现了。
      5. 点击没有任何反应。
      6. 在android的代码中,我们执行的逻辑是打印日志。
      7. 我们需要开启adb的日志,在react-native输入 adb logcat。
      8. 查看日志,可以看到输入语句可以输入了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【干货分享】2024软件测试面试题汇总

前言 本篇分享的软件测试面试题内容主要包括&#xff1a;测试总体、需求分析、测试计划、测试策略、测试用例、缺陷报告、测试总结报告、白盒测试、单元测试、集成测试、系统测试、验收测试等等26个模块。 1. 什么是软件测试&#xff1f; 答&#xff1a;为了发现程序中的错误…

滚动条指定距离滚动

/*** scroller 滚动条元素* to 滚动到位置* duration 滚动时间*/ function scrollLeftTo (scroller, to, duration) {let rafIdlet count 0const from scroller.scrollLeftconst frames duration 0 ? 1 : Math.round((duration * 1000) / 16)function cancel () {cancelAn…

学习CubeIDE——定时器开发

在b站上学习洋桃电子关于HAL库开发&#xff0c;发现使用CubeIDE是真的简单又方便。 实验现象&#xff1a;使用定时器来产生中断&#xff0c;中断程序是LED灯翻转 在我看来&#xff0c;定时器&#xff0c;是一个从0开始增1&#xff08;常规&#xff09;&#xff0c;增加到一定…

存量新篇,商机无限,2024中国重庆建博会将于下月开展

在步入存量房时代的全新篇章中&#xff0c;中国家居建材行业正孕育着前所未有的转型机遇与商业蓝海。重庆作为西南地区的璀璨明珠与战略要地&#xff0c;以前所未有的决心与力度&#xff0c;推进实施了旧改局改与以旧换新等一系列创新政策。 《关于加快推进中心城区旧城改造工…

心觉:小时候常听到的这些教导,正在禁锢你的人生,该翻身了

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作175/1000天 小时候&#xff0c;我们常常被父母或老师教导&#xff1a; 不要去打扰别人 不要影响别人 不要出头 人多要往后站 …

【免费下载】信通院的DCMM标准解读

荐言&#xff1a;深入解读信通院DCMM标准&#xff0c;引领数据管理新高度在数字化转型的浪潮中&#xff0c;数据管理已成为企业核心竞争力的重要组成部分。中国信息通信研究院&#xff08;信通院&#xff09;发布的《数据管理能力成熟度评估模型》&#xff08;DCMM&#xff09;…

OpenAi assistant run always fails when called from PHP

题意&#xff1a;从 PHP 调用时&#xff0c;OpenAI 助理运行总是失败。 问题背景&#xff1a; The runs I create with the openai-php library fail direct in 100% of cases. What am I doing wrong? I do not have much experience with php but this is the test script.…

屏幕翻译软件实时工具有哪些?剧粉朋友看这里

日常生活的忙碌之余&#xff0c;观看剧集成为放松心情的绝佳方式。 但当遇到非母语的影视作品时&#xff0c;语言差异可能会让人感到难以投入。 幸运的是&#xff0c;现在有了屏幕翻译软件&#xff0c;我们不再需要为听不懂外语而烦恼。 这些软件能够在你观看剧集时即时翻译…

MySQL索引知识个人笔记总结(持续整理)

本篇笔记是个人整理的索引知识总结&#xff0c;刚开始有点乱&#xff0c;后续会一直边学边整理边总结 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。就好比索引就是数据的目录 索引结构 Btree索引,Hash索引,Full-text索引&#xff0c;R-tree(空…

SpringBoot+Vue+MySQL驾校预约管理系统

目录 前言 功能设计 系统实现 获取源码 博主主页&#xff1a;百成Java 往期系列&#xff1a;Spring Boot、SSM、JavaWeb、python、小程序 前言 随着社会的进步&#xff0c;各行各业都在充分利用信息化时代的优势。由于计算机技术的广泛应用和普及&#xff0c;各种信息系统…

8年测试工程师 —— 如何使用Playwright优化测试性能!

优化Playwright测试性能是确保自动化测试快速、可靠地执行的重要环节。以下是一些具体的策略和技术&#xff0c;可以帮助你提高Playwright测试的性能&#xff1a; 1. 减少不必要的页面加载 避免重定向&#xff1a;确保测试URL直接指向最终页面&#xff0c;避免不必要的重定向。…

罗马数字详解

一. 罗马数字の背景 1. 罗马数字的诞生与进化 罗马数字起源于古罗马帝国&#xff0c;拥有一个漫长而复杂的历史&#xff0c;始于公元前 8 世纪至 9 世纪&#xff0c;与古罗马帝国在帕兰丁山&#xff08;Palantine Hill&#xff09;周围建立的时间大致相同。不过&#xff0c;罗…

【网络编程】socket套接字|sockaddr|sockaddr_in|通信过程

目录 ​编辑 源IP地址和目的IP地址 Socket 网络字节序 socket编程接口 sockaddr结构 sockaddr sockaddr_in(IPv4) sockaddr_in(IPv6) 完整的套接字&#xff08;socket&#xff09;通信过程 创建socket套接字 bind绑定套接字 listen建立监听 accept接受连接 connect…

错题集锦之C语言

直接寻址和立即寻址 算法的又穷性是指算法程序的运行时间是有限的 未经赋值的全局变量值不确定 集成测试是为了发现概要设计的错误 自然连接要求两个关系中进行比较的是相同的属性&#xff0c;并且进行等值连接&#xff0c;在结果中还要把重复的属性列去掉 赋值运算符 赋值…

CAFE: Catastrophic Data Leakage in Vertical Federated Learning(纵向联邦学习)

NeurIPS 2021 发表单位&#xff1a;美国伦斯勒理工学院、IBM研究院、国立阳明交通大学 GitHub&#xff1a;https://github.com/DeRafael/CAFE 摘要&#xff1a; 梯度共享机制&#xff08;批处理&#xff09;会泄露私有数据—>提出数据泄露攻击CAFE—>提出缓解CAFE对策 在…

云计算课程作业1

作业1 Xmanager连接 rhel连接 作业2 首先确认你的虚拟机设置的是NAT 1-3 然后打开这篇blog&#xff0c;并完成第一步和第二步 因为我们是NAT&#xff0c;所以不需要连接网桥&#xff0c;即跳过第三步&#xff0c;但是这里ping一下测试网络连接 2- 如果到这里你发现提示yum…

2024 Oracle CloudWorld的信息量实在太大了

2024年9月9日&#xff0c;为期4天的2024甲骨文全球云大会在美国拉斯维加斯盛大开幕。今年的主题聚焦于&#xff0c;通过将最新的AI技术融入其产品和服务&#xff0c;以构建和使用应用、云技术、数据库、开发人员工具和人工智能服务&#xff0c;帮助各个行业解决复杂的业务挑战。…

【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣99, 1305, 230, 897

1. 力扣99&#xff1a;恢复二叉搜索树 1.1 题目&#xff1a; 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&…

天润融通创新功能,将无效会话转化为企业新商机

“您好&#xff0c;请问有什么可以帮您&#xff1f;” “......” 一个新的咨询会话进来&#xff0c;但客户却并不说话&#xff0c;这种情况客服人员肯定不会陌生&#xff0c;它一般被称为“无效会话”。 如今“无效会话”越来越多&#xff0c;已经成为困扰无数企业的难题。…

最清晰 | 自学前端之js

怎么在vscode中运行网页代码 1、在vscode中安装插件“ open PHP/HTML/JS ” 2、在代码区域,右键点击” open PHP/HTML/JS in browser " 一、js概念 1、是什么: (1)运行在客户端(浏览器) (2)一种编程语言(脚本语言) (3)实现人机交互 2、做什么: (1)网页…