AndroidでNodeJSを実行することを扱う古いSOスレッドがたくさんあります。これらのほとんどはもはや実行可能(JXCore)ではなく、かつ/または混乱、古く、不完全、または誤った情報を提供します。
したがって、現在(2017年8月現在)実行可能なアプローチと思われるものを調査し、3つの候補を見つけました。
それらの間で決定するために、私は知りたいです:
実行可能なアプローチは次のとおりです:
それに加えて、関連する興味深いリソースがいくつか見つかりました。
[ [〜#〜] note [〜#〜] この回答には、元の質問にあった発見]
さまざまなオプションについてもう少し調査しましたが、ここにいくつかの予備的な調査結果があります。
各オプションは、Android用にコンパイルされたNodeJSの形式を使用します。ただし、オプションを使用するには、おそらく異なるノード、Android、およびアーキテクチャ(x86、ARM、ARM64など)バージョンにコンパイルする必要があります。
これには問題があります。 NodeJSにはAndroid-configure
スクリプトがありますが、これは私が試したほとんどの組み合わせでエラーになります。ビルドスクリプトを機能させるために、githubの問題をいくつか作成しました。この問題では、結果が収集されます。
要約する:
libnode.a
で静的にリンクされたNodeJS(libj2v8.so
)を含むJ2V8は、7.xから7.9.0
まで動作します@ mafintosh :Termuxを使用してNodeをデバイスに転送し、 そこでコンパイルを実行 (多くのスペースと時間を必要としますが、動作します)で興味深い回避策が使用されました。
J2V8は、V8のJavaバインディングのセットです。 J2V8は、パフォーマンスとV8との緊密な統合に重点を置いています。 [...] [これは] JSコードとJavaコード間でより静的な型システムを強制しますが、中間オブジェクトが作成されないため、パフォーマンスも向上します。 [...]
J2V8をビルドするには、ネイティブパーツとJavaライブラリ(.jar/.aarファイル)の両方をビルドする必要があります。ネイティブパーツをビルドするには、まずnode.jsをライブラリとしてビルドしてから、J2V8をそれに静的にリンクします。 [...]
J2V8のクロスコンパイルには、Docker(Android、Linux、Windows)とVagrant(macos)を使用します。
スライドシェアを参照してください: Java世界で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
ビルドステップ(またはall
)を選択します。
NodeJS --> CMake --> JNI --> Optimize --> Java/Android --> JUnit
V8を共有ライブラリーとしてコンパイルしますlibj2v8_{platform}_{abi}.{ext}
nodejs
ビルドステップはNode共有ライブラリをビルドできません(エラー)。libnode.a
にリンクされる静的なlibj2v8.so
を作成します.aar
です長所:
短所:
Androidのノードは、共有ライブラリを使用してAndroidアプリ内でNode.jsを実行することで機能します。次に、UIコードをホストする
WebView
をバンドルします。すべてのUIは、古典的なhtml/css/jsです。ノードアプリでは、
node-on-Android
を要求してWebViewにアクセスできます。これを使用して、WebView
にhtmlページをロードできます。
node-on-Android
作成者( @ mafintosh )によると、これはV8を直接本物としてコンパイルするため、J2V8より簡単で優れています。
機能:
特性:
app
project:の関連ディレクトリ/ファイル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
をスピンアップするだけlibnode.so
のJNIがないため、private native void startNode(String... app);
はIDEでエラーとして表示されます(ただしコンパイルされます)Android/app/src/main/assets/node
にありますloadUrl
function を介してWebViewにロードするビューを指定しますnode-on-Android
を介してアクセス可能なノードサービス長所:
短所:
arm64
アーキテクチャ(フルモバイルサポート予定、またはDIYビルド)専用ですReactネイティブアプリの背後で、バックグラウンドでrealNode.jsプロセスを実行します。
このパッケージを使用すると、Androidでhttpサーバーを実行し、Nodeストリームを使用し、ファイルシステムとインターフェイスし、React NativeのJSスレッドから重い処理をオフロードできます。 Androidで実際のNode.jsを実行すると、デスクトップ上のNode.jsでできることをすべて実行できます。
機能:
特性:
Service
を実行します)node
は、組み込み共有ライブラリではなく、アプリケーションとしてコンパイル/使用されます{projectRoot}/background
にあります/Android/src/main/res/raw/bin_node_v710
にありますRNNode
は、react-native-node
[.____をインポートすることでRNで利用可能です。]react-native-node
には、ビルド時にNodeコードを転送するCLIも含まれていますhttp://localhost:5000
でexpress
サーバーを実行しています長所:
短所:
7.1.0
バージョンが付属しています(ただし、 DIYビルド 新しいバージョン)私の目標はReact Native + NodeJSです。これは私の活動のステータスです:
libc++
に対してコンパイルされます)react-native-node
はコンパイルしますが、何度も試行しても動作しませんnode-on-Android
は動作しますが、ノードのみのアプリ開発であり、64ビットはRNと互換性がありません私はreact-native-node
とJ2V8
を組み合わせることにしました:
.aar
をビルドしますReact Native 0.46.4
+ NodeJS 7.9.0
が動作するようになりました!見る:
私の使用例: P2P分散ネットワークを使用した脂肪クライアント
私はCQRS(コマンドクエリ責任責任分離)デザインを考えています。
詳細: Realm.ioがネイティブNodeJSをブリッジ+ ReactネイティブAndroid脂肪クライアントアプリ(CQRSスタイル)
NodeJSをAndroidに移植しようとしている人々が何年も経った後でも、本当に良いソリューションはまだありません。
プロジェクトをセットアップして環境を構築する際には、多くのハードルとエラーが予想されますが、一度セットアップすれば、携帯電話でNodeを最大限に活用できます。
今日(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/node-chakracore のフォークであり、これは nodejs/node のフォークです。 Androidバージョンは、いくつかの移植性を修正して、ライブラリとして構築されたほぼ通常のNode.jsです。iOSバージョンは、V8の代わりにChakraCoreエンジンを使用します(V8をChakraCoreに置き換えることは、 nodejs/node-chakracoreフォークの変更)。
React NativeおよびCordovaプラグインにより、これらのフレームワークを使用して構築されたアプリケーションにNode.jsを簡単に追加できます。Node.jsコードは、フレームワークの(React Native/Cordova )。2つのJavaScriptワールド間の通信は、プラグインによって提供されるメッセージングブリッジを介して実現されます。
いくつかのドキュメントを含む詳細情報は、 プロジェクトWebサイト で入手できます。
(完全開示:私は、モバイルアプリ向けNode.jsを開発する会社で働いています。)
Noded) の作成者である @ dna2github から answer を受け取りました(感謝します!)
こんにちは、
あなたの質問のためのTHX。私は私の意見で簡単な答えをします。
長所:
短所:
長所:
短所:
長所:
短所:
LiquidCoreに馴染みがありません。特にURLからマイクロサービスを構築することは、iOSで直接利用可能なストレージを解決することだと思います。 react-native-node Android部分はNodeBaseメソッドに基づいており、ビルド済みのバイナリを使用します。
NodeBaseの場合:
長所:
短所:
最初に、ターミナルでノードを実行します。開発者だけが簡単にそれを使用してjsアプリを起動できることがわかりました。私の友人や家族もいくつかのツールを使いたいです。例えば、バッチで写真にウォーターマークを作成します。 NodeBaseは、アプリを簡単に起動/停止できるように作成されています。次に、ブラウザを開いて使用するだけです。 NodeBaseを作成するもう1つのアイデアは、同じWi-Fiで共有できる共有可能なアプリケーションを構築できるということです。ホストがアプリを起動すると、近くの人がアプリにアクセスできます。その後、彼らは一緒に働き、遊ぶことができます。たとえば、狼男を演じ、裁判官がいないときは、狼男アプリを起動して、最初のラウンドの裁判官を持ちます。また、ダウンロード/アップロードを介してデバイス間でファイルを共有することもできます。
私にとっては、たとえば、機械学習ランナーとしてAndroidにしたいと思います。ノードとpythonを使用して、いつでも機械学習プログラムを実行できます。 、したがって、私の別のレポで: dna2oslab は、バイナリの構築に焦点を当てています)電話の実行時間を利用します。
短時間でアプリを移植したい場合は、2をお勧めします。時間と他のリソースがある場合は、1の方が優れています。 3おもちゃ/デモを作成する場合。 4他は常に可能であり、作品を作成するためにあなたの想像力を発揮してください。
よろしく、セブン
私は LiquidCore の著者です。 LiquidCoreでは、Node.jsの完全な実装をAndroidとiOSの両方で使用できます(iOSサポートはバージョン0.5.0でリリースされました-2018年9月)。
LiquidCoreは、Nodeの複数のインスタンスをネイティブモバイルアプリ内で同時に実行できるように設計されています。各インスタンスには、独自の仮想ファイルシステムとMySQLのネイティブサポートがあります。プロジェクトの目標は、 JavaScript/WebAssemblyを使用して完全な「マイクロアプリ」を作成し、それを他のアプリに組み込むことができますが、私はまだその目標に向かって取り組んでいます。
できることを確認したい場合は、 Android と iOS の両方に含まれるシンプルなノードコンソールアプリがあります。
Android Javaアプリでnode.jsを介してJSスクリプトを実行します。このエラーで失敗します。
Java.lang.UnsupportedOperationException:StartNodeJSはサポートされていません。
J2V8からの応答は次のとおりです。
「ノードラッパーはAndroidでは使用できません。デスクトッププラットフォーム(windows、mac、linux)でのみ使用可能です。これはAndroidのノードバイナリができるまでの予想される動作です。」
私の知る限り、Android用のノードラッパーを実装する現在の計画はありません。
おかげで、
アレックス・ドニーニ