文档模板:v0.4.2
本项目基于 react-native-modpow 开发,是其在 React Native 鸿蒙(OpenHarmony)平台的适配版本,新的包名为:@react-native-ohos/react-native-modpow,版本所属关系如下:
| 三方库名称 | 三方库版本(npm地址) | 发布信息 | 支持RN版本 | Autolink | 编译API版本 | 社区基线版本 | 源码地址 |
|---|---|---|---|---|---|---|---|
| @react-native-ohos/react-native-modpow | ~ 1.1.0 | GitHub Releases | 0.84.* / 0.82.* / 0.77.* / 0.72.* | 是 | API12+ | 1.1.0 | master |
导出原生 BigInteger.modPow() 能力,为 node-forge 等 JS 密码学库提供大数模幂运算加速,避免 RSA 密钥生成把 UI 阻塞一分钟以上。
鸿蒙端基于 ArkTS bigint 实现平方-乘算法,以同步 TurboModule 方法导出,语义与 Android / iOS 原库一致。
进入到工程目录并输入以下命令:
npm
npm install @react-native-ohos/react-native-modpowyarn
yarn add @react-native-ohos/react-native-modpow| 是否支持autolink | RN框架版本 | |
|---|---|---|
| ~ 1.1.0 | 是 | 0.84 / 0.82 / 0.77 / 0.72 |
使用 AutoLink 的工程需要根据 Autolink 框架指导文档 配置。
Manual Link 配置(Autolink 不可用时)
说明:本模块需要同时在 C++ 侧和 ETS 侧注册 Package。
在工程根目录 oh-package.json5 添加:
{
"overrides": {
"@rnoh/react-native-openharmony": "./react_native_openharmony"
}
}打开 entry/oh-package.json5,添加:
"dependencies": {
"@react-native-ohos/react-native-modpow": "file:../../node_modules/@react-native-ohos/react-native-modpow/harmony/modpow.har"
}执行 ohpm install。
打开 entry/src/main/cpp/CMakeLists.txt,添加:
set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-modpow/src/main/cpp" ./modpow)
target_link_libraries(rnoh_app PUBLIC modpow)打开 entry/src/main/cpp/PackageProvider.cpp,添加:
#include "ModpowPackage.h"
std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
return {
std::make_shared<ModpowPackage>(ctx),
};
}打开 entry/src/main/ets/RNPackagesFactory.ets,添加:
import { ModpowPackage } from '@react-native-ohos/react-native-modpow/ts';
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
return [
new ModpowPackage(ctx),
];
}点击右上角的 sync 按钮
或者在命令行终端执行:
cd entry
ohpm install然后编译、运行即可。
本文档内容基于以下版本验证通过:
- RNOH: 0.72.139; SDK: HarmonyOS API 12+; DevEco Studio: 5.0+。
Example 已适配 0.72 / 0.77 / 0.82 / 0.84 四个框架版本,可用 npm run framework 一键切换(见快速验证)。
无需声明 ohos.permission,也无需运行时动态申请权限。
[!TIP] 当前三方库已支持在
API12+工程编译。
[!TIP] 本库为纯 ArkTS
bigint计算,无云端服务、无系统能力版本依赖,所有 API 在支持的 RNOH 版本上行为一致。
下面的代码展示了这个库的基本使用场景:
[!WARNING] 使用时 import 的库名不变:
import modPow from 'react-native-modpow'(由 RNOH alias 映射到@react-native-ohos/react-native-modpow)。
import modPow from 'react-native-modpow'
const result = modPow({
target: '2', // 底数(十六进制字符串)
value: '2', // 指数(十六进制字符串)
modifier: '3' // 模数(十六进制字符串)
})
// result = '1'(2^2 mod 3 = 1)node-forge RSA 密钥生成加速(本库主要用途):
import Forge from 'node-forge'
import modPow from 'react-native-modpow'
Forge.jsbn.BigInteger.prototype.modPow = function nativeModPow (e, m) {
const result = modPow({
target: this.toString(16),
value: e.toString(16),
modifier: m.toString(16)
})
return new Forge.jsbn.BigInteger(result, 16)
}modPow为同步阻塞调用,与原库两端语义一致(AndroidisBlockingSynchronousMethod = true/ iOSRCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD),不返回 Promise;RSA 2048 位级大参数计算期间会阻塞调用线程,调用方需自行评估阻塞时长(Example 内置大参数实测用例可验证)。target/value/modifier必须为非空十六进制字符串([0-9a-fA-F]+),且modifier非零;非法输入(非十六进制字符 / 空串 / 零模数)以受控Error抛出,对齐 iOS 端RCTMakeError的防御式行为(Android 原库为原生抛异常)。- 返回值为小写十六进制字符串、无前导零、无
0x前缀,与java.math.BigInteger.toString(16)格式一致。
[!TIP] "平台"列表示该属性在原三方库上支持的平台。
[!TIP] "OpenHarmony平台支持"列为 "是" 表示 OpenHarmony 平台支持该属性;"否" 则表示不支持;"部分支持" 表示仅实现了功能的一部分。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。
| 名称 | 类型 | 参数类型 | 返回值 | 必填 | 平台 | OpenHarmony平台支持 | 描述 |
|---|---|---|---|---|---|---|---|
| modPow | function | args: { target: string, value: string, modifier: string } |
string | 是 | All | 是 | 大数模幂运算 target^value mod modifier,同步阻塞。三个参数均为十六进制字符串,返回小写十六进制字符串(无前导零、无 0x 前缀)。 |
无。原库唯一公开能力 modPow 已在鸿蒙端完整实现,无平台能力缺失项。
| 依赖 | 版本要求 |
|---|---|
| Node.js | >= 18 |
| DevEco Studio | 5.0+ / 6.0+ |
| HarmonyOS SDK | API 12+ |
1. 克隆仓库
git clone <仓库地址>
cd <仓库目录>2. 安装依赖并构建
npm install --legacy-peer-deps
npm pack # 生成 tgz 包(会自动触发 prepare 构建 JS 产物)3. 进入 example 目录,安装依赖
cd example
npm install --legacy-peer-deps4. 生成 JS Bundle
npm run dev产物:harmony/entry/src/main/resources/rawfile/bundle.harmony.js
5. 用 DevEco Studio 打开鸿蒙工程
- 打开 DevEco Studio
- 选择
example/harmony目录 - 等待 Sync 完成
6. 编译并运行 HAP
在 DevEco Studio 中点击运行按钮,将 HAP 安装到设备/模拟器。
注意:Example 中已预置插件依赖和 Package 注册,无需手动配置 Link。
Example 支持在 0.72 / 0.77 / 0.82 / 0.84 之间一键切换 RNOH 框架版本:
cd example
npm run framework -- 0.77 # 切换版本(改写 package.json / babel / oh-package)
npm install --legacy-peer-deps # 重装依赖
npm run framework -- 0.77 --sync-har # 按 node_modules 实际 HAR 文件校正指向或一条命令完成「切换 + npm install + ohpm install」:
npm run run:harmony -- 0.77切换时脚本会自动:
- 改写
react/react-native/@react-native-oh/react-native-harmony版本及全部 devDependencies/overrides - 更新 babel preset(0.72 用
metro-react-native-babel-preset,0.77+ 用@react-native/babel-preset) - 同步
harmony/oh-package.json5与harmony/entry/oh-package.json5中@rnoh/react-native-openharmony的 HAR 指向(0.72 为react_native_openharmony_release.har,0.77+ 为react_native_openharmony.har) - 版本变化时清理旧的
node_modules/oh_modules/ lock 文件
当前使用的框架版本记录在 example/.framework-version(不入库)。
无
无
/react-native-modpow # 项目根目录
├── harmony/ # 鸿蒙适配代码
│ ├── modpow.har # HAR 包
│ └── modpow/ # 鸿蒙模块源码
│ ├── index.ets # 模块入口
│ ├── ts.ets # TS 声明入口
│ ├── oh-package.json5
│ └── src/main/
│ ├── ets/ # ArkTS 实现
│ │ ├── ModpowTurboModule.ets
│ │ ├── ModpowTurboModulesFactory.ets
│ │ └── generated/ # Codegen 产物
│ └── cpp/ # C++ 桥接
│ ├── CMakeLists.txt
│ ├── ModpowPackage.h
│ └── generated/ # Codegen 产物
├── src/ # RN JS / Spec
│ ├── index.ts # JS 入口
│ └── specs/v1/NativeModpow.ts # TurboModule Spec
├── example/ # 门禁 example
│ └── scripts/use-framework.js # RNOH 框架版本切换脚本
├── package.json
├── README.md
├── README_en.md
└── LICENSE
使用过程中发现任何问题都可以提交 Issue,当然,也非常欢迎提交 PR。
本项目基于 The MIT License (MIT),请自由地享受和参与开源。感谢原始库 react-native-modpow。