Arn*_*ver 32 javascript java android node.js react-native
有许多旧的SO线程处理在Android上运行NodeJS.其中大多数不再可行(JXCore)和/或提供令人困惑,过时,不完整或错误的信息.
因此,我调查了目前(截至2017年8月)可行的方法,并找到了三个可能的候选人.
要在他们之间做出决定,我想知道:
可行的方法是:
除此之外,我还找到了许多相关的有趣资源:
Arn*_*ver 15
[ 注意这个答案包含原始问题中的发现 ]
我已经对各种选项进行了更多调查,这里有一些初步调查结果.
每个选项都使用为Android编译的某种形式的NodeJS.但是要使用任何选项,您可能希望编译到不同的Node,Android和体系结构(x86,ARM,ARM64等)版本.
这是有问题的.NodeJS有一个android-configure脚本,但这会导致我尝试过的大多数组合出错.我为一个工作的构建脚本创建了许多github问题.在此问题中收集结果:
总结一下:
libnode.a)静态链接libj2v8.so工作7.x至7.9.0@mafintosh使用了一个有趣的解决方法:使用Termux将Node传输到设备并在那里进行编译(需要很多空间和时间,但有效).
J2V8是一组用于V8的Java绑定.J2V8专注于性能和与V8的紧密集成.[...] [which]强制在JS和Java代码之间建立一个更静态的类型系统,但它也提高了性能,因为没有创建中间对象.[...]
构建J2V8需要构建本机部分和Java库(.jar/.aar文件).要构建本机部分,我们首先将node.js构建为库,然后将J2V8静态链接到该库.[...]
对于交叉编译,J2V8使用Docker(android,linux,windows)和Vagrant(macos).
请参阅slideshare:在Java World中运行 NodeJS (或参见InfoQ视频,32 分钟)
特点:
特点:
build_system/build_settings.py只需使用python build.py --interactive,选择构建即可开始构建:
[0] Docker >> android-x86 >> NODE_ENABLED
[1] Docker >> android-arm >> NODE_ENABLED
[2] Docker >> alpine-linux-x64 >> NODE_ENABLED
[3] Docker >> linux-x64 >> NODE_ENABLED
[4] Docker >> linux-x86 >> NODE_ENABLED
[5] Vagrant >> macosx-x64 >> NODE_ENABLED
[6] Vagrant >> macosx-x86 >> NODE_ENABLED
[7] Native >> windows-x64 >> NODE_ENABLED
[8] Docker >> windows-x64 >> NODE_ENABLED
[9] Vagrant >> windows-x64 >> NODE_ENABLED
Run Code Online (Sandbox Code Playgroud)选择构建步骤(或all):
NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
Run Code Online (Sandbox Code Playgroud)将V8编译为共享库 libj2v8_{platform}_{abi}.{ext}
nodejs构建步骤无法构建节点共享库(错误),创建libnode.a要链接的静态libj2v8.so.aar,包含为项目依赖项优点:
缺点:
Android上的节点通过使用共享库在Android应用程序内运行您的Node.js来工作.然后捆绑一个
WebView托管您的UI代码.所有UI都只是经典的html/css/js.在节点应用程序中,您可以要求
node-on-android访问WebView.您可以使用它来加载html页面WebView.
根据node-on-android创建者(@mafintosh),它比J2V8更容易和更好,因为它直接编译V8 作为真实的东西.
特点:
特点:
app项目中的相关目录/文件:
app/src/main/include/node带节.h点头app/src/main/jniLibs/arm64-v8a用libc++_shared.so和libnode.soapp/src/main/cpp与native-lib.cpp(包括node.h)Service在一个单独的线程中运行一个节点libnode.so,因此private native void startNode(String... app);在IDE中显示为错误(但编译)android/app/src/main/assets/nodeloadUrl函数
指定要在WebView中加载的视图node-on-android优点:
缺点:
arm64架构(完全移动支持计划,或DIY构建)
在React Native应用程序后面的后台运行一个真正的 Node.js进程.
使用此软件包,您可以:在Android中运行http服务器,使用节点流,与文件系统接口,从React Native中的JS线程卸载一些繁重的处理,等等!在Android中运行真正的Node.js,您可以执行桌面上Node.js的所有操作.
特点:
特点:
Service在单独的线程上运行Node)
node被编译/用作应用程序,而不是嵌入式共享库{projectRoot}/background/android/src/main/res/raw/bin_node_v710RNNodeRN导入节点服务react-native-node
react-native-node 还包含在构建时传输节点代码的CLIexpress服务器http://localhost:5000优点:
缺点:
7.1.0版本(但DIY构建新的版本)我的目标是React Native + NodeJS.这是我的活动状态:
libc++)react-native-node 编译,但尽管尝试很多,但不会运行node-on-android 工作,但仅限节点的应用程序开发和64位与RN不兼容我决定结合react-native-node使用J2V8,因为:
.aar,可以轻松地包含在Gradle中React Native 0.46.4+ NodeJS 7.9.0现在正在运行!看到:
我的用例:胖客户端与P2P分散式网络
我正在考虑CQRS(命令查询 - 责任 - 隔离)设计:
详细信息:Realm.io将在Android胖客户端应用程序(CQRS样式)中桥接本机NodeJS + React Native
即使在多年的人试图将NodeJS移植到Android之后,仍然没有真正好的解决方案,它是开创性的.
在设置项目和构建环境时会遇到许多障碍和错误,但一旦设置完毕,您就可以在手机上享受Node的全部功能.
Ale*_*lla 10
截至今天(2018年3月),还有另一个尚未列入当前答案的可行替代方案:Node.js for Mobile Apps.
该项目的核心是提供一个本地库,用于将Node.js嵌入到原生Android和iOS应用程序中; 但它也附带了React Native和Cordova的插件.
该库的预构建二进制文件适用于Android armeabi-v7a,x86,arm64-v8a,x86_64和iOS 64位.
核心库是一个叉的NodeJS /节点chakracore,这又是叉的NodeJS /节点.Android版本是非常常规的Node.js构建为库,具有一些可移植性修复.iOS版本使用ChakraCore引擎而不是V8(由于nodejs/node-chakracore fork的更改,可以用ChakraCore替换V8).
React Native和Cordova插件可以更轻松地将Node.js添加到使用这些框架构建的应用程序中.Node.js代码运行在一个单独的引擎和线程中,而不是框架(React Native/Cordova).两个JavaScript世界之间的通信是通过插件提供的消息传递桥实现的.
项目网站上提供了更多信息,包括一些文档.
(完全披露:我为开发移动应用程序的Node.js的公司工作.)
| 归档时间: |
|
| 查看次数: |
6193 次 |
| 最近记录: |