native 订阅
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。 展开全文
native是一个计算机函数,一个Native Method就是一个Java调用非Java代码的接口。方法的实现由非Java语言实现,比如C或C++。
信息
外文名
native
类    型
计算机术语
中文名
原生方法
软    件
Java
nativeNative Method(原生方法)
"A native method is a Java method whose implementation is provided by non-java code." [1]  在定义一个native method时,并不提供实现体(有些像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。下面给了一个示例:这些方法的声明描述了一些非Java代码在这些Java代码里看起来像什么样子(view).标识符native可以与所有其它的java标识符连用,但是abstract除外。这是合理的,因为native暗示这些方法是有实现体的,只不过这些实现体是非java的,但是abstract却显然的指明这些方法无实现体。native与其它java标识符连用时,其意义同非Native Method并无差别,比如native static表明这个方法可以在不产生类的实例时直接调用,这非常方便,比如当你想用一个native method去调用一个C的类库时。上面的第三个方法用到了native synchronized,JVM在进入这个方法的实现体之前会执行同步锁机制(就像java的多线程。)一个native method方法可以返回任何java类型,包括非基本类型,而且同样可以进行异常控制。这些方法的实现体可以制一个异常并且将其抛出,这一点与java的方法非常相似。当一个native method接收到一些非基本类型时如Object或一个整型数组时,这个方法可以访问这些非基本型的内部,但是这将使这个native方法依赖于你所访问的java类的实现。有一点要牢牢记住:我们可以在一个native method的本地实现中访问所有的java特性,但是这要依赖于你所访问的java特性的实现,而且这样做远远不如在java语言中使用那些特性方便和容易。native method的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM将控制调用本地方法的所有细节。需要注意当我们将一个本地方法声明为final的情况。用java实现的方法体在被编译时可能会因为内联而产生效率上的提升。但是一个native final方法是否也能获得这样的好处却是值得怀疑的,但是这只是一个代码优化方面的问题,对功能实现没有影响。如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用java语言重写这个方法(这个似乎看起来有些奇怪),同样的如果一个本地方法被final标识,它被继承后不能被重写。本地方法非常有用,因为它有效地扩充了JVM。事实上,我们所写的Java代码已经用到了本地方法,在Sun的Java的并发(多线程)的机制实现中,许多与操作系统的接触点都用到了本地方法,这使得java程序能够超越Java运行时的界限。有了本地方法,Java程序可以做任何应用层次的任务。
收起全文
精华内容
下载资源
问答
  • native
    千次阅读
    2022-03-27 23:27:15

    以下答案为参考了一些资料并思考后汇总,还没想通的就没有写进来,如果有好的回答请在评论区留言~
    后续了解更多rn的知识后会补充以及更新

    1. react native中的ScrollView组件是什么

    ScrollView 组件是一个通用滚动容器,可以承载多个组件和视图。您可以垂直和水平滚动(通过设置 horizontal 属性)。ScrollView 还可用于在 IOS 中实现收缩和缩放功能。在视图之间水平滑动也可以使用 ViewPagerAndroid 组件在 Android 上实现。ScrollView 最适合呈现少量大小有限的内容。ScrollView 的所有元素和视图都将渲染,即使它们当前未显示在屏幕上也是如此。

    import React from 'react';
    import { View, Text, Image, ActivityIndicator, StyleSheet, ScrollView } from "react-native";
    
    const initialState = { pictures: [
    {id:0, download_url:"https://picsum.photos/id/0/5616/3744" },
    {id:1, download_url: "https://picsum.photos/id/1002/4312/2868"},
    {id:2, download_url: "https://picsum.photos/id/1006/3000/2000"},
    {id:3, download_url: "https://picsum.photos/id/1015/6000/4000"}
    ] };
    class PictureList extends React.Component {
        constructor(props) {
            super(props);
            this.state = initialState;
        }
       
        render() {
            const { pictures } = this.state;
            if (!pictures.length) { return (<ActivityIndicator />); }
            return (
                <View>
                    <ScrollView>
                      {pictures.map(picture => (
                        <View style={styles.container} key={picture.id}>
                            <Image style={styles.image} source={{uri: picture.download_url}} />
                        </View>
                      ))}  
                     />
                </View>
            );
        }
    }
    
    const styles = StyleSheet.create({
        container: {
            borderColor: '#ccc',
            borderWidth: 1,
            borderRadius: 5,
            backgroundColor: '#eaf7fd',
            marginBottom: 15,
        },
        image: {
            margin: 5,
            borderRadius: 5,
            width: 300,
            height: 300,
        }
    });
    
    export default PictureList;
    

    上面的示例在 ScrollView 中呈现图像列表。我们从 react-native 库中导入 ScrollView 组件,并在 ScrollView 中创建了 Image 元素。每个 Image 元素都有自己的宽度和高度,通过 CSS 设置。当您运行上述代码并滚动屏幕时,您应该能够浏览所有图像渲染。滚动视图用于在移动应用程序上创建可滚动的 UI。它适用于IOS和Android。

    2. 什么是FlatList,相比于ScrollView有什么区别

    React native 提供了 FlatList 组件来显示长列表。

    FlatList 适用于长数据列表,其中项目数可能会随时间而变化,比如我们常见的滚动到底部加载更多。

    与适用更多场景的 ScrollView 不同,FlatList 只渲染屏幕上的可见元素,而不是列表中的所有元素。因此FlatList 比 ScrollView 性能更高,因为列表内的元素只有在进入屏幕可视区域时才会渲染,而ScrollView是全部渲染。

    3.如何在react native中发起api请求

    我们可以使用javascript的api > fetch来进行请求

    async function getPic(){
        const api = 'https://picsum.photos/v2/list';
        const fetchResponse = await fetch(api);
        // 拿到结果
        const pictures = await fetchResponse.json();
    }
    

    4. 什么是非受控组件和受控组件

    4.1 受控组件

    在 HTML 中,表单元素(如、 和 )通常自己维护 state,并根据用户输入进行更新。而在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。

    我们可以把两者结合起来,使 React 的 state 成为“唯一数据源”。渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入元素就叫做“受控组件”。

    4.2 非受控组件

    非受控组件将真实数据储存在 DOM 节点中,因此在使用非受控组件时,有时候反而更容易同时集成 React 和非 React 代码。如果你不介意代码美观性,并且希望快速编写代码,使用非受控组件往往可以减少你的代码量。否则,你应该使用受控组件。

    4.3 对比

    简而言之,组件的状态由可控的数据管理,则为受控组件,如果组件的状态没有可控的数据管理,则为非受控组件

    5. 说说你对高阶函数的理解

    高阶函数的基本定义是,如果函数接受一个函数作为参数或返回另一个函数,则该函数称为高阶函数。

    高阶函数的好处在于方便我们多次复用一部分代码来实现功能,我们也可以通过函数柯里化的方式来实现高阶函数,这里简单说下什么是函数柯里化(currying)
    让我举个例子:

    function multiplyBy(a) {
    	return function(b) {
    		return a * b;
    	};
    }
    

    此函数是高阶函数,因为它返回一个新函数。此函数将充当不同功能的函数生成器。例如,我可以使用上面的高阶函数创建一个计算双倍值的函数:

    const double = multiplyBy(2);
    console.log(double(4)) //result: 8
    

    类似地,我可以使用相同的高阶函数来生成一个三倍值函数,该函数将数字作为参数并返回三倍于数字。

    const triple = multiplyBy(3);
    console.log(triple(4)) //result: 12
    

    这种类型的函数生成在javascript中被称为柯里化(currying)。这是一种很不错的开发方式,因为这可以把基本逻辑和最终要实现的逻辑分离。基本逻辑可以在多个地方复用。

    6. react native中父子组件的通信如何进行

    7. 如何在react native中实现多个屏幕之间的跳转

    移动应用程序包含多个屏幕,并且必须有一种方法可以在应用程序中的多个屏幕中导航。管理多个屏幕的显示和之间的转换通常由所谓的导航器处理。React Navigation提供了一个易于使用的导航解决方案,能够在iOS和Android上呈现常见的堆栈导航和选项卡式导航模式。

    8. react native中的虚拟dom是如何运作的

    Virtual DOM由React核心团队成员Pete Hunt推广。React 通过使用这个术语来解释其性能方面。他们解释说,DOM操作始终是一个繁重的操作,因为浏览器重排,重绘事件由DOM操作触发。浏览器需要根据即将发生的更改重新计算元素的位置。为了优化此浏览器操作,ReactJS 尝试最大程度地减少 DOM 操作操作。React 创建一个内存中数据结构缓存,计算结果差异,然后有效地更新浏览器显示的 DOM。这允许开发人员编写代码,就好像每次更改时都会呈现整个页面一样,而 React 库仅呈现实际更改的子组件。这就是 React 通过将数据结构保留在内存中来增加空间复杂性的方式,但通过减少更新的 DOM 操作次数来降低处理成本,从而实现实际的 DOM。

    9. react native在项目较大时如何管理状态数据

    在 React 中,我们遵循组件驱动开发,这意味着我们将编写几个有状态或无状态的组件,并将它们组合在一起以构建整个应用程序。如果应用程序越来越大,那么在很多情况下,一个组件想要访问任何其他组件的状态。实现此目的的一种方法是将依赖组件作为同一父组件的子组件,然后可以通过回调进行通信。

    这些解决方案适用于小型应用程序,但对于大型应用程序,将回调从父元素传递到最里面的子元素很麻烦。这就是Redux的用武之地。Redux 是一个流行的库,用于有效地维护和管理大型 React 原生应用程序的状态。它提供了一个存储,该存储保持应用程序级状态,开发人员需要编写操作和化简器来修改存储中的状态。任何组件都可以通过使用 Redux 的高阶组件连接与商店连接。任何组件都可以调度一个操作,该操作到达化简器并更新存储中的状态。

    10. react native中如何实现过渡动画

    11. react native组件的key属性有什么用

    12. react native 和 react 是什么关系

    React:
    React 是基础框架,是一套基础设计实现理念,开发者不能直接使用它来开发移动应用或者网页。
    React.js:
    在React框架之上,发展出了React.js 框架来开发网页。
    React Native:
    在React框架之上,发展出来React Native 用来开发移动应用。

    所以要写react native势必要先学会react的使用和理念

    13. react native是怎么做到将js输出成app的,又如何利用js调用ios/android的api

    bundle打包机制

    bridges

    JS Engine

    更多相关内容
  • ReactNative初级到项目实战

    千人学习 2017-12-19 21:25:34
    对课程有什么问题或者有什么好的建议都可以联系Hank老师QQ:471926977 从技术角度,可以... 新颖、实用、详尽的ReactNative初级课程,本 教程涵盖ReactNative官方的新组件和实践,甚 至包括尚未正式发布的新特性 时”!
  • 完全征服React Native

    万人学习 2016-08-22 11:47:32
    React Native是Facebook于2015年推出的跨平台开发... 本课程采用新的ES6开发,主要内容包括ReactNative的基础知识,ReactNative的布局,组件,API,封装本地API和组件,发布ReactNative App,本地与ReactNative深度结合
  • SQL Server2012 增加 SQL Server2000 服务器的链接服务器 先安装这个组件,然后可以成功在sql2012服务器添加mssql2000链接服务器
  • windows 10下使用navicat,报microsoft sql server native client无法安装的错误,发现navicat默认是安装的Microsoft SQL Server 2008 Native Client,但是在windows10上无法安装,在网上找到了这个2012版本的,测试...
  • SQL Server Native Client 10.0 驱动

    热门讨论 2015-11-25 19:43:36
    常用的 SQL Server 驱动程序,不需要多做说明了吧
  • 2022 年 React Native 的全新架构更新

    千次阅读 2022-02-12 16:40:01
    熟悉我的人应该知道,虽然现在我一直主力于 Flutter, 但是 GSY App 系列项目最早其实是 React Native , 之后才是 Weex 和 Flutter , 所以其实我对 RN 一直有着“初恋”的情节,基本上是它带着我走进前端和跨平台的...

    个人前言

    熟悉我的人应该知道,虽然现在我一直主力于 Flutter, 但是 GSY App 系列项目最早其实是 React Native , 之后才是 WeexFlutter所以其实我对 RN 一直有着“初恋”的情节,基本上是它带着我走进前端和跨平台的领域,而恰巧最近看到了关于它的消息,就顺便了解下多年后它又有什么升级。

    直到目前为止,React Native 的版本号是 0.67 ;我看了眼两年没更新的 GSYGithubApp ,用的 React Native 的版本号是 0.61 ,两年里从 61 升级到了 67 ,看来 RN 1.0 正式版这个梗还能继续玩下去。

    正文

    内容参考: https://medium.com/coox-tech/deep-dive-into-react-natives-new-architecture-fb67ae615ccd

    随着 RN 团队关于 深入了解 React Native 的新架构 文章的发布,这次新架构带来的调整主要在于以下四点:

      1. JavaScript Interface(JSI)
      1. Fabric
      1. Turbo Modules
      1. CodeGen

    在 RN App 里,所有的 JS 代码都会打包成一个 JS Bundle 文件保存在本地运行,当 RN App 运行时,一般会有三个线程:

    • 1、 JavaScript 线程:属于 JS 引擎,用于运行 JS Bundle ;
    • 2、 Native/UI 线程:运行 Native Modules 和处理 UI 渲染、用户手势等操作;
    • 3、 Shadow 线程:在渲染之前计算元素的布局;

    在 RN 里 JS 线程和 Native 线程之前是通过 bridge 来交互,而交互的数据必须被转化为 JSON,而这个桥只能处理异步通信。

    JavaScriptCore:JavaScript 引擎,React Native 用它执行 JS 代码;

    Yoga:布局引擎,计算UI位置;

    一、JavaScript Interface (JSI)

    目前 RN 使用 Bridge Module 来让 JS 和 Native 线程进行通信,每次利用 Bridge 发送数据时,都需要转换为 JSON, 而收到数据时也需要进行解码。

    这就意味着 JavaScript 和 Native 直接是隔离的,也就是 JS 线程不能直接调用 Native 线程上的方法

    另一个就是;通过 Bridge 发送的消息本质上是异步的,如果需要 JS 代码和 Naitve 同步执行在之前是无法实现。

    例如,如果 JS 线程需要访问 native modules(例如蓝牙),它就需要向 native 线程发送消息,JS 线程就会通过 Bridge 发送一个 JSON 消息,然后消息在 native 线程上进行解码,最终将执行所需的 native 代码。

    而在全新架构中,Bridge 将被一个名为 JavaScript Interface 的模块所代替,它是一个轻量级的通用层,用 C++ 编写,JavaScript Engine 可以使用它直接执行或者调用 native。

    通用层代表着:JSI 让 JavaScript 接口将与 Engine 分离,这意味着新架构支持 RN 直接使用其他 JavaScript 引擎,比如 Chakrav8Hermes 等等

    那 JSI 如何让 JavaScript 直接调用到原生方法?

    在 JSI 里 Native 方法会通过 C++ Host Objects 暴露给 JS, 而 JS 可以持有对这些对象的引用,并且使用这些引用直接调用对应的方法

    这就类似于 Web 里 JS 代码可以保存对任何 DOM 元素的引用,并在它上面调用方法:

    const container = document.createElement(‘div’);
    

    举个例子,在这里的 container 会包含一些在 C++ 中初始化的 DOM 元素的引用,这时候如果我们调用 container 上的任何方法,它就会调用 DOM 元素上的方法。

    JSI 就是以类似的方式运行,JSI 将允许 JS 代码保存对 Native Modules 的引用,并且 JS 可以直接通过引用去调用 Native 上的方法。

    总结起来就是:

    • JSI 将支持其他 JS 引擎
    • JSI 允许线程之间的同步相互执行,不需要 JSON 序列号等耗费性能的操作
    • JSI 是用 C++ 编写,以后如果针对电视、手表等其他系统,也可以很方便地移植

    二、Fabric

    Fabric 是新的渲染系统,它将取代当前的 UI Manager。

    在 Fabric 之前,当 App 运行时,React 会执行你的代码并在 JS 中创建一个 ReactElementTree ,基于这棵树渲染器会在 C++ 中创建一个 ReactShadowTree

    UI Manager 会使用 Shadow Tree 来计算 UI 元素的位置,而一旦 Layout 完成,Shadow Tree 就会被转换为由 Native Elements 组成的 HostViewTree(例如:RN 里的 会变成 Android 中的 ViewGroup 和 iOS 中的 UIView)。

    而之前线程之间的通信都发生在 Bridge 上,这就意味着需要在传输和数据复制上耗费时间。

    例如如果一个 ReactElementTree 节点恰好是一个 <Image/>,那么 ReactShadowTree 的节点也会是一个图像,但是这些数据必须被复制并分别存储在两个节点中。

    另外由于 JS 和 UI 线程不同步,因此在某些情况下 App 可能会因为丢帧而显得卡顿(例如滚动有大量数据的 FlatList

    而得益于前面的 JSI, JS 可以直接调用 Native 方法,其实就包括了 UI 方法,所以 JS 和 UI 线程可以同步执行从而提高列表、跳转、手势处理等的性能

    使用新的 Fabric 渲染,用户交互(如滚动、手势等)可以优先在主线程或 Native 线程中同步执行,而 API 请求等其他任务使用异步执行。

    另外新的 Shadow Tree 将成为 immutable,它会在 JS 和 UI 线程之间共享,以两端进行直接交互

    在以前 RN 必须维护两个层次结构的 DOM 节点,但因为现在 Shadow Tree 可以共享,在减少内存消耗的部分也会得到相应的优化。

    三、Turbo Modules

    在之前的架构中 JS 使用的所有 Native Modules(例如蓝牙、地理位置、文件存储等)都必须在应用程序打开之前进行初始化,这意味着即使用户不需要某些模块,但是它仍然必须在启动时进行初始化。

    Turbo Modules 基本上是对这些旧的 Native 模块的增强,正如在前面介绍的那样,现在 JS 将能够持有这些模块的引用,所以 JS 代码可以仅在需要时才加载对应模块,这样可以将显着缩短 RN 应用的启动时间

    四、Codegen

    Codegen 主要是用于保证 JS 代码和 C++ 的 JSI 可以正常通信的静态类型检查器,通过使用类型化的 JS 作为参考来源,CodeGen 将定义可以被 Turbo 模块和 Fabric 使用的接口,另外 Codegen 会在构建时生成 Native 代码,减少运行时的开支。

    从上面四点可以看到 2022 年 RN 将迎来性能和体验上的跃迁,本次即将到来的全新架构将解决 RN 多年以后被人诟病的各种根本上的设计问题

    Skia

    另外还要介绍的内容就是 react-native-skia ,目前它还处于 alpha release 的阶段,但是它也给 RN 带来的新的可能。

    众所周知,Flutter 跨平台的性能提升和解耦来自于直接使用 Skia 渲染而非系统控件,而如今 RN 也有类似的支持。

    react-native-skia 需要 react-native@>=0.66 的支持,而目前它上面的操作都还是十分原始的 canvas 行为,例如通过 Circle 绘制圆形,通过 blendMode 配置重叠模式等。

    import {Canvas, Circle, Group} from "@shopify/react-native-skia";
     
    export const HelloWorld = () => {
      const width = 256;
      const height = 256;
      const r = 215;
      return (
        <Canvas style={{ flex: 1 }}>
          <Group blendMode="multiply">
            <Circle cx={r} cy={r} r={r} color="cyan" />
            <Circle cx={width - r} cy={r} r={r} color="magenta" />
            <Circle
              cx={width/2}
              cy={height - r}
              r={r}
              color="yellow"
            />
          </Group>
        </Canvas>
      );
    };
    

    当然它也支持直接使用 SkiaView ,然后通过 canvas 来绘制你需要的图形:

    import {Skia, BlendMode, SkiaView, useDrawCallback} from "@shopify/react-native-skia";
     
    const paint = Skia.Paint();
    paint.setAntiAlias(true);
    paint.setBlendMode(BlendMode.Multiply);
     
    export const HelloWorld = () => {
      const width = 256;
      const height = 256;
      const r = 215;
      const onDraw = useDrawCallback((canvas) => {
        // Cyan Circle
        const cyan = paint.copy();
        cyan.setColor(Skia.Color("cyan"));
        canvas.drawCircle(r, r, r, cyan);
        // Magenta Circle
        const magenta = paint.copy();
        magenta.setColor(Skia.Color("magenta"));
        canvas.drawCircle(width - r, r, r, magenta);
        // Yellow Circle
        const yellow = paint.copy();
        yellow.setColor(Skia.Color("yellow"));
        canvas.drawCircle(width/2, height - r, r, yellow);
      });
      return (
        <SkiaView style={{ flex: 1 }} onDraw={onDraw} />
      );
    };
    

    目前该库支持 Image、Text、Shader、Effects、Shapes、Animations 等操作,而事实上该库的实现和 Flutter 很是相似,比如:

    在 Android 上的 SkiaDrawView 其实就是 TextureView ,绘制逻辑是作者自己写的 reactskia 上,这里只是借助了 TextureViewsurfaceTouchEvent 等的支持。

    如下图所示,是关于使用 react-native-skia 实现的一段 Demo ,详细可见: https://shopify.github.io/react-native-skia/

    可以预见目前的 react-native-skia 还有不少问题需要解决,但是它让 RN 可以更高效地使用丰富的 Canvas 能力,对于 RN 的未来而言不免是一次不错的尝试。

    展开全文
  • Win10可用的Microsoft SQL Server 2008 Native Client

    千次下载 热门讨论 2016-05-16 14:50:47
    Win10可用的Microsoft SQL Server 2008 Native Client Navicat 操作数据库 会用到
  • React Native开发环境搭建

    千次阅读 2022-02-28 15:47:17
    本文基于react版本17.0.2、react-native版本0.67.3,使用mac开发,介绍基于现有Android、IOS原生项目搭建react native开发环境,强烈建议使用个好一点的梯子。 RN环境搭建 以下步骤已安装的可跳过 首先安装Homebrew...

    前言

    本文基于react版本17.0.2、react-native版本0.67.3,使用mac开发,介绍基于现有Android、IOS原生项目搭建react native开发环境,强烈建议使用个好一点的梯子。以下所有步骤,请避免使用中文路径或文件名,否则一堆诡异bug!!!

    RN环境搭建

    以下步骤已安装的可跳过

    1. 首先安装Homebrew
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
    1. 安装 Node 和 Watchman
    brew install node
    brew install watchman
    # 使用nrm工具切换淘宝源
    npx nrm use taobao
    
    1. 安装 Yarn
    npm install -g yarn
    
    1. Android开发环境搭建,首先是jdk11安装
    brew install adoptopenjdk/openjdk/adoptopenjdk11
    

    Android Studio安装与配置相信各位都能自己搞定,重点是需要配置环境变量,shell 是 zsh(mac默认),则配置文件为~/.zshrc,如果是 bash 则为~/.bash_profile(可以使用echo $0命令查看你所使用的 shell):

    # 如果你不是通过Android Studio安装的sdk,则其路径可能不同,请自行确定清楚
    export ANDROID_HOME=/Users/XXX/Library/Android/sdk
    export PATH=${PATH}:${ANDROID_HOME}/tools
    export PATH=${PATH}:${ANDROID_HOME}/platform-tools
    export PATH=${PATH}:${ANDROID_HOME}/emulator
    export PATH=${PATH}:${ANDROID_HOME}/tools/bin
    

    再使用命令生效:

    source ~/.zshrc
    
    1. IOS需要先安装与配置Xcode:
      在这里插入图片描述

    请注意,如果开发机器是m1芯片,运行ios模拟器会报诸如“The linked library ‘xxx’ is missing…”,需要设置Xcode以Rosetta方式打开,首先在Finder——应用程序中找到Xcode
    在这里插入图片描述

    接着,双击-显示简介-将【使用Rosstta打开】选项打开

    在这里插入图片描述
    在这里插入图片描述

    再清除 Xcode中的DeriveData,Finder打开对应的文件夹:/Users/XXX/Library/Developer/Xcode/DerivedData,将DerivedData删除,之后执行pod install即可解决。
    下一步是使用brew安装CocoaPods:

    brew install cocoapods
    
    1. 请先使用命令卸载掉旧版本react native工具,避免冲突:
    npm uninstall -g react-native-cli
    

    强烈建议使用初始化版本React Native搭建开发环境,官方集成到现有原生应用大多数配置均已过时。使用命令搭建初始化React Native项目:

    npx react-native init XXProject
    

    如需指定rn版本,可以在末尾添加” --version X.XX.X“指定版本。

    以上步骤走完之后,就可以运行起react native的demo了:

    cd XXProject
    yarn ios
    # 或者
    yarn android
    

    ios和android命令配置在了package.json文件里,可以根据需要修改:

    "scripts": {
        "acd": "react-native run-android --variant 编译变种 --main-activity 启动activity全路径(默认为.MainActivity)",
        "android": "react-native run-android"
        "ios": "react-native run-ios",
        "start": "react-native start",
        "test": "jest",
        "lint": "eslint ."
      },
    

    强烈建议再使用npx react-native init Samle命令新建一个Sample项目,供后续参考配置。

    git集成

    协同作业一般建议android项目一个git仓库,ios项目一个git仓库,外层是react native开发仓库。如果此时已有rn项目git,则先拉取远端代码:

    git clone {远程仓库地址}
    

    再使用命令搭建必要rn环境:

    yarn add react-native
    

    若有类似警告:

    warning "react-native@0.52.2" has unmet peer dependency "react@16.2.0".
    

    则需要安装指定版本react:

    yarn add react@16.2.0
    

    如希望ios与android原生git仓库不纳入react native开发仓库,可将ios与android目录加入gitignore文件,然后执行命令使其生效:

    git rm -r --cached .
    git add .
    git commit -m "update .gitignore"
    

    Android嵌入原生

    按照搭建开发环境配置环境,并新建一个XXProject项目做参考,上一步已经完成了,本文使用的Android配置为:
    在这里插入图片描述

    1. 以XXProject作为rn项目根目录,删除android目录下所有内容(包括隐藏文件,显示隐藏文件请按command + shift + .),把Android项目整个拷到里面,注意android目录就是Android项目的根目录。
    2. 在app目录的build.gradle文件中添加React Native和JSC引擎依赖:
    dependencies {
        ...
        implementation "com.facebook.react:react-native:+" // From node_modules
        implementation "org.webkit:android-jsc:+"
    }
    

    在项目的build.gradle文件中为React Native和JSC引擎添加maven源的路径:

    allprojects {
        repositories {
            maven {
                // All of React Native (JS, Android binaries) is installed from npm
                url "$rootDir/../node_modules/react-native/android"
            }
            maven {
                // Android JSC is installed from npm
                url("$rootDir/../node_modules/jsc-android/dist")
            }
            ...
        }
        ...
    }
    
    1. 配置autolinking,使代码可以在使用第三方原生依赖时,不再需要执行额外react-native link的命令,就可以自动关联三方库。首先配置settings.gradle:
    apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
    

    再配置app/build.gradle:

    apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
    
    1. AndroidManifest.xml中配置
     <uses-permission android:name="android.permission.INTERNET" />
    

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

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

    开发者菜单一般仅用于在开发时从Packager服务器刷新JavaScript代码,所以在正式发布时你应该去掉这一权限。

    1. 为 debug 版本启用 usesCleartextTraffic选项,路径为src/debug/AndroidManifest.xml中添加usesCleartextTraffic:
    <application
      android:usesCleartextTraffic="true" tools:targetApi="28" >
      <!-- ... -->
    </application>
    
    1. Application实现ReactApplication接口:
    public class MyReactApplication extends Application implements ReactApplication {
        @Override
        public void onCreate() {
            super.onCreate();
            SoLoader.init(this, false);
        }
    
        private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
            @Override
            public boolean getUseDeveloperSupport() {
                return BuildConfig.DEBUG;
            }
    
            protected List<ReactPackage> getPackages() {
                List<ReactPackage> packages = new PackageList(this).getPackages();
                // Packages that cannot be autolinked yet can be added manually here
                return packages;
            }
        };
    
        @Override
        public ReactNativeHost getReactNativeHost() {
            return mReactNativeHost;
        }
    }
    
    1. 集成Activity时,强烈建议继承ReactActivity,而不是使用官方集成方式
    /**
     * rn测试类
     */
    class RNIndexActivity : ReactActivity(), IBaseActivity {
        // 指定连接的Component的名称,在index.js中定义
        // 需要注意,尽量不要去修改默认的入口如index.js等
        override fun getMainComponentName(): String = "XXProject"
    }
    
    1. 集成Fragment时,可以使用ReactFragment.Builder:
    Fragment reactNativeFragment = new ReactFragment.Builder()
            .setComponentName("XXProject")
            .setLaunchOptions(getLaunchOptions("可选参数"))
            .build();
    
    getSupportFragmentManager()
            .beginTransaction()
            .add(R.id.reactNativeFragment, reactNativeFragment)
            .commit();
    

    如需直接继承ReactFragment,则需要设置setArguments:

    ReactFragment fragment = new ReactFragment();
    Bundle args = new Bundle();
    args.putString("arg_component_name", componentName);
    args.putBundle("arg_launch_options", launchOptions); // 选填
    fragment.setArguments(args);
    

    集成之后就可以使用yarn android命令看效果了。

    Android打包

    发布时,可以使用命令

    npx react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
    

    打出离线包,再正常打apk就可以把离线包加入生成的apk里。参数 --dev标记了是否开发环境,开发环境下错误信息等都比较详细,生产包需要false。此外,Android开发环境下(react-native版本0.67.3,getUseDeveloperSupport = false),会有内存泄漏问题。

    IOS嵌入原生

    1. 以XXProject作为rn项目根目录,删除ios目录下所有内容(包括隐藏文件,显示隐藏文件请按command + shift + .),把ios项目整个拷到里面,注意ios目录就是IOS项目的根目录。
    2. 在确保原项目能正常运行的前提下,删除Gemfile、Gemfile.lock、Podfile.lock、Pods/Pods.xcodeproj文件,packag/e.json文件新增配置如下:
    require_relative '../node_modules/react-native/scripts/react_native_pods'
    require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
    ...
    target 'XXProject' do
      ...
      # ****************rn专区***************
      config = use_native_modules!
    
      use_react_native!(
        :path => config[:reactNativePath],
        # to enable hermes on iOS, change `false` to `true` and then install pods
        # hermes是meta用于替换jsc的在移动端的高效jsc
        :hermes_enabled => false
      )
    
      # target 'XXProjectTests' do
      #   inherit! :complete
      #   # Pods for testing
      # end
    
      # Enables Flipper.
      #
      # Note that if you have use_frameworks! enabled, Flipper will not work and
      # you should disable the next line.
      # use_flipper!()
      
      # 以下配置若报错,可以不开启
      # post_install do |installer|
      #   react_native_post_install(installer)
      #   __apply_Xcode_12_5_M1_post_install_workaround(installer)
      # end
    end
    

    步骤二主要是为了解决pod install时,报错undefined method `[]’ use_native_modules!。

    1. 在ios目录执行pod install,成功后rn已集成进IOS项目。
    2. 可参照官方集成,但还是建议参照Sample工程。

    原生项目中,调用部分RN页面或者调用部分RN组件。在RN看来,页面和组件在广义上都是组件,对应于原生里的View。

    步骤为:在需要引进的VC或AppDelegate,导入以下头文件

    #import <React/RCTBridge.h>
    #import <React/RCTRootView.h>
    #import <React/RCTBundleURLProvider.h>
    #import <React/RCTBridgeDelegate.h>
    

    相关的VC或AppDelegate,实现RCTBridgeDelegate的代理:

    @interface BMMHCenterViewController ()<RCTBridgeDelegate>
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>
    

    并实现方法:

    - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
    {
    #if DEBUG
      return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
    #else
      return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
    #endif
    }
    

    上方代码块中,DEBUG模式下的jsBundleURLForBundleRoot为"index",即为RN项目中的入口js文件。如果安卓和iOS端相互分开,即可新建一个名字:index.ios.js的文件作为入口。

    然后上方代码块中的jsBundleURLForBundleRoot需要改为"index.ios"即可

    案例1为在AppDelegate通过直接在rootViewController使用引入RN页面或者调用部分RN组件,其代码实现为:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
      RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
      RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                                       moduleName:@"RNProject"
                                                initialProperties:nil];
      self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
      UIViewController *rootViewController = [UIViewController new];
      rootViewController.view = rootView;
      self.window.rootViewController = rootViewController;
      [self.window makeKeyAndVisible];
      return YES;
    }
    

    代码块里的moduleName中的RNProject,是RN中的注册的模块名。
    案例2为直接在VC上添加RN的页面

    - (void)viewDidLoad {
        [super viewDidLoad];
        RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil];
        RCTRootView *rnView = [[RCTRootView alloc] initWithBridge:bridge
                                                         moduleName:@"RNProject"
                                                  initialProperties:nil];
    
        [self.view addSubview:rnView];
        [rnView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.right.bottom.offset(0);
        }];
    }
    

    此时即完成在原生项目中,调用部分RN页面或者调用部分RN组件的代码编写。然后就可以运行混合代码

    1.进入RNProject目录下,运行命令:npm start。待启动服务器成功后,如图:

    在这里插入图片描述

    2.点击iOS项目工程BMBlueMoon.xcworkspace,运行代码进入我们刚才嵌入RN页面既可以查看到RN编写的页面。

    IOS打包

    在确保拥有apple开发者账号和xcode 跑项目,确定项目没问题的前提下,进行生成react native 项目的离线资源包。
    解释一下react native 打包的原理:RN ios打包的本质其实还是ios打包,只是我们要把 要打包rn的代码,图片资源文件等编译生成一个离线资源包文件(也就是bundle文件),放到xcode里面,然后通过xcode打包项目一起发布到App Strore中。具体操作看后面
    生成 RN 离线资源文件:cd 到项目文件夹下,然后跑下面命令 node

    node_modules/react-native/local-cli/cli.js bundle --entry-file index.ios.js --platform ios --dev false --bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/bundle
    

    我们来看一下我们打包的命令

    node node_modules/react-native/local-cli/cli.js bundle --entry-file index.ios.js --platform ios --dev false --bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/bundle

    node node_modules/react-native/local-cli/cli.js bundle 这一截你不用管他,把它看成脚本命令就好

    –entry-file 要打包的入口文件 我们这里是:index.ios.js(针对iOS另起的index.js)

    –dev false 是否是debug 模式,我们打包的肯定不是debug模式咯,所以false

    –bundle-output ./ios/bundle/index.ios.jsbundle --assets-dest ./ios/bundle ,–bundle-output是生成的bundle文件放的文件位置,后面跟的就是文件位置了,我们上面提示的错误就是这里导致的,因为我们要存放的bundle文件位置为./ios/bundle/index.ios.jsbundle,我们打开我们的项目目录你会发现ios文件目录下没有bundle文件夹,所以在把资源文件写入的时候才会导致失败。解决办法就是在项目的ios文件目录下手动创建一个bundle文件夹
    在这里插入图片描述
    解决问题重新来一下编译:成功了,可以看到ios/bundle也有文件了

    在这里插入图片描述
    然后把bundle文件夹 添加xcode 中,即为离线包生成完成之后,可以在ios目录下看到一个bundle目录,这个目录就是bundle生成的离线资源。 需要在Xcode中添加资源到项目中Add files to **,必须使用Create folder references的方式添加文件夹.

    进行代码块修改,即为修改AppDelegate 或者VC中代码,加载前面生产的bundle文件资源

    - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
    {
    #if DEBUG
      return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];
    #else
      return [[NSBundle mainBundle] URLForResource:@"bundle/index.ios" withExtension:@"jsbundle"];
    #endif
    }
    

    后续流程的打包和ios打包正常流程一样

    参考资料

    React Native官方网站

    展开全文
  • react native 极光推送 jpush-react-native

    千次阅读 2022-03-22 10:47:47
    依赖包:jpush-react-native、jcore-react-native 准备: 1.首先要在极光推送有个账号【注册/登录 以下链接:极光推送】 2.ios设备要把证书申请了【ios推送证书配置】 3.下载安装依赖包【jpush-react-native...

    平台:android、ios

    依赖包:jpush-react-native、jcore-react-native

    准备:

            1.首先要在极光推送有个账号【注册/登录 以下链接:极光推送

            2.ios设备要把证书申请了【ios推送证书配置

            3.下载安装依赖包【jpush-react-native、jcore-react-native】

    npm install jpush-react-native jcore-react-native

    一、极光推送设置:

            1.登陆后到应用管理画面

         点击右上角【应用管理】

     2.创建应用填写项目名(必填)和用途(不填或随便选选都行)

     3.首先先创建android【这里如果只用推送就之选消息推送就行,然后点下一步】

     填写包名,包名可以在【android/app/src/main/AndroidManifest.xmlmanifest标签的package属性上查看】

     最后这里给了一个demo下面还写了android项目的配置方法都可以拿下来试一试,也可以直接点上面的ios去配置ios

     4.创建ios:

            第一步和Android的一样 ,我这里只用推送所以只选了【消息推送】

    第二步这里要用到之前配置好的生产模式和开发模式的推送证书 ,就是上面【准备】时的 【ios推送证书配置

     上传完之后这里也给了ios的配置方法

     5.查看AppKey【点应用设置可以看到】

    二、android配置

           1. 【android/app/src/main/AndroidManifest.xml】

                    在application标签下添加

            <meta-data android:name="JPUSH_CHANNEL" android:value="${JPUSH_CHANNEL}" />

            <meta-data android:name="JPUSH_APPKEY" android:value="${JPUSH_APPKEY}" />

             2. 【android\app\build.gradle】

                    在dependencies下添加

    implementation project(':jpush-react-native')  // 添加 jpush 依赖
    implementation project(':jcore-react-native')  // 添加 jcore

                    【这个可以不加在代码init中设置也可以】在defaultConfig下添加

    manifestPlaceholders = [
                      JPUSH_APPKEY:"xxxxxx",         //在此替你的APPKey
                      JPUSH_CHANNEL: "xxxxxx"        //在此替你的channel
              ]

            3.【android\settings.gradle】

    include ':jpush-react-native'
    project(':jpush-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jpush-react-native/android')
    include ':jcore-react-native'
    project(':jcore-react-native').projectDir = new File(rootProject.projectDir, '../node_modules/jcore-react-native/android')

     

     三、IOS配置

            1.pod【到ios文件夹下,执行pod install】               

    项目根目录>cd ios
    项目根目录/ios>pod install

            2. AppDelegate.m文件添加代码:【可参照:AppDelegate.m文件

                    1)导包部分:

    #import <RCTJPushModule.h>
    
    // 以下两个包是上面参照文件中没有的但是要加上
    #import "JPUSHService.h"
    #import <UserNotifications/UserNotifications.h>

                     2)didFinishLaunchingWithOptions下添加如下代码【位置可以参照以下第二张图或AppDelegate.m文件

      // APNS
      JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
      if (@available(iOS 12.0, *)) {
        entity.types =         JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;
      }
      [JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
      [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
      // 自定义消息
      NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter];
      [defaultCenter addObserver:self selector:@selector(networkDidReceiveMessage:) name:kJPFNetworkDidReceiveMessageNotification object:nil];
      // 地理围栏
      [JPUSHService registerLbsGeofenceDelegate:self withLaunchOptions:launchOptions];

                     3)在文件最下面【@end上一行】

     

    //************************************************JPush start************************************************
    
    //注册 APNS 成功并上报 DeviceToken
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
      [JPUSHService registerDeviceToken:deviceToken];
    }
    
    //iOS 7 APNS
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:  (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
      // iOS 10 以下 Required
      NSLog(@"iOS 7 APNS");
      [JPUSHService handleRemoteNotification:userInfo];
      [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
      completionHandler(UIBackgroundFetchResultNewData);
    }
    
    //iOS 10 前台收到消息
    - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center  willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
      NSDictionary * userInfo = notification.request.content.userInfo;
      if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        // Apns
        NSLog(@"iOS 10 APNS 前台收到消息");
        [JPUSHService handleRemoteNotification:userInfo];
        [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_ARRIVED_EVENT object:userInfo];
      }
      else {
        // 本地通知 todo
        NSLog(@"iOS 10 本地通知 前台收到消息");
        [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_ARRIVED_EVENT object:userInfo];
      }
      //需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以选择设置
      completionHandler(UNNotificationPresentationOptionAlert);
    }
    
    //iOS 10 消息事件回调
    - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler: (void (^)(void))completionHandler {
      NSDictionary * userInfo = response.notification.request.content.userInfo;
      if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        // Apns
        NSLog(@"iOS 10 APNS 消息事件回调");
        [JPUSHService handleRemoteNotification:userInfo];
        // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
        [[RCTJPushEventQueue sharedInstance]._notificationQueue insertObject:userInfo atIndex:0];
        [[NSNotificationCenter defaultCenter] postNotificationName:J_APNS_NOTIFICATION_OPENED_EVENT object:userInfo];
      }
      else {
        // 本地通知
        NSLog(@"iOS 10 本地通知 消息事件回调");
        // 保障应用被杀死状态下,用户点击推送消息,打开app后可以收到点击通知事件
        [[RCTJPushEventQueue sharedInstance]._localNotificationQueue insertObject:userInfo atIndex:0];
        [[NSNotificationCenter defaultCenter] postNotificationName:J_LOCAL_NOTIFICATION_OPENED_EVENT object:userInfo];
      }
      // 系统要求执行这个方法
      completionHandler();
    }
    
    //自定义消息
    - (void)networkDidReceiveMessage:(NSNotification *)notification {
      NSDictionary * userInfo = [notification userInfo];
      [[NSNotificationCenter defaultCenter] postNotificationName:J_CUSTOM_NOTIFICATION_EVENT object:userInfo];
    }
    
    //************************************************JPush end************************************************

              2.Xcode设置

                    1)Push Notification

                    查看【Signing & Capabilities】有没有 【Push Notification】,没有的话向下图一样添加

                    单机【+】,在弹出的搜索框中搜索【Push Notification】并添加

                    2)查看【Build Phasses】下【Link Binart With Libraries】是否有以下项目,没有的话点下面的【+】添加

    libz.tbd
    CoreTelephony.framework
    Security.framework
    CFNetwork.framework
    CoreFoundation.framework
    SystemConfiguration.framework
    Foundation.framework
    UIKit.framework
    UserNotifications.framework
    libresolv.tbd

     四、代码

        // 初始化
        JPush.init({"appKey":"你的极光推送key","channel":"dev","production":1});
        //连接状态
        this.connectListener = result => {
            console.log("connectListener:" + JSON.stringify(result))
        };
        JPush.addConnectEventListener(this.connectListener);
    
        //通知回调
        this.notificationListener = result => {
            console.log("notificationListener:" + JSON.stringify(result))
        };
        JPush.addNotificationListener(this.notificationListener);
    
        //本地通知回调
        this.localNotificationListener = result => {
            console.log("localNotificationListener:" + JSON.stringify(result))
        };
        JPush.addLocalNotificationListener(this.localNotificationListener);
    
        //tag alias事件回调
        this.tagAliasListener = result => {
            console.log("tagAliasListener:" + JSON.stringify(result))
        };
        JPush.addTagAliasListener(this.tagAliasListener);
    
        //手机号码事件回调
        this.mobileNumberListener = result => {
            console.log("mobileNumberListener:" + JSON.stringify(result))
        };
        JPush.addMobileNumberListener(this.mobileNumberListener);
    
    
        JPush.getRegistrationID((registerID) => {
          console.log('registerID : ', registerID);
        })

          

    展开全文
  • 组件化APP集成React Native实践

    千次阅读 2022-04-25 16:56:10
    如何集成React Native3.1 React Native集成到原生应用:3.2 React Native工程搭建:3.2.1 技术选型3.2.2 工程目录结构 1. 为什么要集成React Native   虽然XXX Connect APP采用组件化技术后,可以支持全品类智能...
  • ReactNative用javascript开发移动应用

    热门讨论 2016-05-05 10:23:26
    React Native是当前移动端开发中的优秀解决方案。《React Native:用JavaScript开发移动应用》围绕着如何将一个完整App提交到App Store,讲解了使用React Native开发iOS应用所涉及的方方面面。首先介绍了Flexbox布局...
  • ReactNative常用插件使用

    千次阅读 2022-02-09 15:02:26
    目前使用的项目node版本v14.17.5, npm版本6.14.14, reactNative项目使用的模板结合typescript语法的项目模板架构,安装的方式如下: npx react-native init xxx(项目名) --template react-native-template-typescript...
  • Learning React Native.pdf 0分

    热门讨论 2015-12-17 15:34:27
    Get a practical introduction to React Native, the JavaScript framework for writing and deploying fully featured mobile apps that look and feel native. With this hands-on guide, you’ll learn how to ...
  • React Native概述 React是一个构建用户界面的JS框架,实现了数据的响应式和组件化开发,本身既可以用于Web网站项目,也可以用于创建移动端App项目. 相较于Vue.js在移动端只能构建WebApp,React生态系统中有一个可以构建...
  • NativeActivity开发APP原理

    千次阅读 2022-02-10 13:51:36
    我们可以用Java开发app,或者结合使用Java和C|C++开发app,NativeActivity则为单独使用C|C++开发app提供支持。 从开发者的角度看,我们是在单独用C++开发app,但从底层看还是离不开Java。 在android源码中,已经...
  • SQL Server 2012 Native Client11.0

    热门讨论 2015-04-18 17:38:39
    SQL Server 2012 Native Client11.0 官方版
  • SQL server Native Client 10.0

    热门讨论 2013-05-06 16:39:01
    SQL server Native Client 10.0,此为64位的ODBC数据源,亲测SQL Server 2008 r2支持良好,其它数据库版未测试,是组建64位DSN的必备组件。
  • 注:本篇博客参考了此篇:React Native实现扫描二维码功能基于react-native-camera 感谢 孙先森i 的分享;我也来加把火; 电脑:Mac; 安卓手机:小米6钉子户 环境:react-native 0.66.x 库:react-native-...
  • hadoop-2.6.0编译好的64bit的native

    千次下载 热门讨论 2015-03-23 10:45:10
    用缺省的32位native库(/opt/hadoop-2.6.0/lib/native)会出现下面的错误: 14/01/27 10:52:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes ...
  • 随着美团点评业务的快速发展,业务方对 B 端产品(商家端)版本迭代速度和资源方面提出更高要求,React Native 的出现恰恰解决了这两个问题。时至今日,已经使用 React Native 一年有余,开发了近十余个功能,热更新...
  • react native开发的时候用到的这个高德的定位模块【react-native-amap-geolocation】 支持android和ios,在这里简单的捋一下流程。 一、申请apiKey 由于【react-native-amap-geolocation】使用的高德地图,因此...
  • 一个关于穿山甲广告 native 崩溃分析

    千次阅读 2022-04-22 10:25:04
    Hello 村长 1、 崩溃日志 日志 1 关键日志 Failed to register native method ...Failed to register native method:看样子是 so 相关 详细日志 Failed to register native method com.bykv.
  • 在去年也整理过 《移动端跨平台开发的深度解析》 的对比文章,时隔一年之后,本篇将重新由 环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来 等七个方面,对当前的 React Native 和 ...
  • React Native版本升级

    千次阅读 2022-03-31 16:10:41
    文章目录一、项目原使用的版本:二、React 与 React Native之间的关系:三、了解如何升级四、升级流程4.1 查看react-native当前版本4.2 查看react-native当前最新版4.3 查看react当前最新版4.4 卸载react-native4.5 ...
  • Cloud Native Go 英文无水印pdf pdf使用FoxitReader和PDF-XChangeViewer测试可以打开
  • react native使用echarts图表

    千次阅读 2022-03-21 14:20:44
    react native使用echarts图表
  • React Native 介绍

    千次阅读 2020-12-29 13:44:40
    文章目录一丶React-native是什么二丶React Native引进原因三丶React学习需要的知识四丶React三个特点五丶React-native的优缺点六丶React-native的机制特性七丶React-native的工作原理八丶React Native开发流程九丶对...
  • react Native 环境安装配置——图解版一目了然

    千次阅读 多人点赞 2021-12-14 09:49:13
    利用一点时间去关注了最近比较火爆的两款APP开发语言,分别是Flutte rn(React Native) Flutte 还是 react Native 至于大家如何去选择呢,网络上很多对两者的对比,也比较全面了,下面就是一作者在文章中总结的...
  • chrome extension native message & native client

    千次阅读 2019-08-08 14:33:57
    Extensions and apps can exchange messages with native applications using an API that is similar to the othermessage passing APIs. Native applications that support this feature must register anative .....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 925,843
精华内容 370,337
关键字:

native