有很多旧的SO线程处理在Android上运行NodeJS的问题。其中大多数不再可行(JXCore)和/或提供令人困惑,过时,不完整或错误的信息。
因此,我调查了目前(截至2017年8月)似乎可行的方法,并找到了三种可能的候选方法。
要在他们之间做出决定,我想知道:
可行的方法是 :
除此之外,我发现了许多相关的有趣资源:
[ 注意 此答案包含原始问题中的发现]
我已经研究了各种选择,这里是一些初步的发现。
每个选项都使用某种形式的为Android编译的NodeJS。但是要使用任何选项,您可能希望将其编译为不同的Node,Android和体系结构(x86,ARM,ARM64等)版本。
这是有问题的。NodeJS有一个android-configure脚本,但这会导致我尝试过的大多数组合出现错误。我为工作的构建脚本创建了许多github问题。在本期中,收集结果:
android-configure
总结一下:
libnode.a
libj2v8.so
7.9.0
@mafintosh使用了一种有趣的解决方法:使用Termux将Node传输到设备并在那里进行编译(需要大量的空间和时间,但是可以工作)。
1.运行包含NodeJS J2V8的V8 JavaScript引擎
J2V8是V8的一组Java绑定。J2V8专注于性能以及与V8的紧密集成。[…]强制在JS和Java代码之间使用更静态的类型系统,但由于未创建中间对象,因此还提高了性能。[…] 构建J2V8需要同时构建本机部分和Java库(.jar / .aar文件)。为了构建本机部分,我们首先将node.js构建为一个库,然后将J2V8静态链接到该库。[…] 对于交叉编译,J2V8使用Docker(Android,Linux,Windows)和Vagrant(macos)。
J2V8是V8的一组Java绑定。J2V8专注于性能以及与V8的紧密集成。[…]强制在JS和Java代码之间使用更静态的类型系统,但由于未创建中间对象,因此还提高了性能。[…]
构建J2V8需要同时构建本机部分和Java库(.jar / .aar文件)。为了构建本机部分,我们首先将node.js构建为一个库,然后将J2V8静态链接到该库。[…]
对于交叉编译,J2V8使用Docker(Android,Linux,Windows)和Vagrant(macos)。
特点 :
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
选择构建步骤(或all):
all
NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
将V8编译为共享库 libj2v8_{platform}_{abi}.{ext}
libj2v8_{platform}_{abi}.{ext}
nodejs
.aar
优点 :
缺点 :
mobile/node-on-android))
android上的Node通过使用共享库在android应用中运行Node.js来工作。然后WebView,它捆绑了一个托管您的UI代码的。所有的UI都是经典的html / css / js。 在节点应用程序中,您可能需要node-on-android访问WebView。您可以使用它在中加载html页面WebView。
android上的Node通过使用共享库在android应用中运行Node.js来工作。然后WebView,它捆绑了一个托管您的UI代码的。所有的UI都是经典的html / css / js。
WebView
在节点应用程序中,您可能需要node-on-android访问WebView。您可以使用它在中加载html页面WebView。
node-on-android
根据node-on-android创建者(@mafintosh)的说法,这比J2V8更容易和更好,因为它直接将V8编译 为真实的东西 。
app
app/src/main/include/node
.h
app/src/main/jniLibs/arm64-v8a
libc++_shared.so
libnode.so
app/src/main/cpp
native-lib.cpp
node.h
Service
private native void startNode(String... app);
android/app/src/main/assets/node
loadUrl
arm64
在React Native应用程序的后台在后台 运行 真实的 Node.js进程。 使用此软件包,您可以:在Android中运行http服务器,使用Node流,与文件系统接口,从React Native的JS线程中卸载一些繁重的处理工作,等等!在Android中运行真正的Node.js,您可以执行桌面上Node.js可以执行的所有操作。
在React Native应用程序的后台在后台 运行 真实的 Node.js进程。
使用此软件包,您可以:在Android中运行http服务器,使用Node流,与文件系统接口,从React Native的JS线程中卸载一些繁重的处理工作,等等!在Android中运行真正的Node.js,您可以执行桌面上Node.js可以执行的所有操作。
node
{projectRoot}/background
/android/src/main/res/raw/bin_node_v710
RNNode
react-native-node
express
http://localhost:5000
7.1.0
我的目标是React Native + NodeJS。这是我的活动状态:
libc++
我之所以决定合并react-native-node,J2V8是因为:
J2V8
React Native 0.46.4+ NodeJS 7.9.0现在可以使用了!看到:
0.46.4
我的用例: 具有P2P去中心化网络的胖客户端
我正在考虑一个CQRS(命令-查询-责任-隔离)设计:
即使经过多年尝试将NodeJS移植到Android上的人们,仍然没有真正好的解决方案,它是先锋。
在设置项目和构建环境时,会遇到许多障碍和错误,但是一旦设置,您就可以在手机上享受Node的全部功能。