プレーンな C++ アプリケーションをアセットとしてパッケージ化する Java Android アプリに取り組んでいます。実行中、Android アプリは C++ バイナリをそのプライベート ファイルシステム サブフォルダーに抽出し、 を使用してバックグラウンド プロセスとして実行しjava.lang.ProccessBuilder
、双方向通信用のソケットをセットアップします。
ソケット接続は、ネイティブ プロセスが Java の親とのみ通信したい場合に限り、問題なく機能します。問題は、ネイティブ プロセスが Web サイト ドメインなどのリモート サーバーへのソケット接続を開こうとする場合です。この場合、POSIX 関数の呼び出しはint connect(int socket, const struct sockaddr *address, socklen_t address_len)
エラー コードENETUNREACH
(ネットワークへのルートがない) で失敗します。
android.permission.INTERNET
Android アプリは、インターネット リソースにアクセスする前に、マニフェストにアクセス許可を追加する必要があることを認識しています。私は自分の Android アプリにそれを実行しましたが、どうやらこのアクセス許可は Java コードから生成されたネイティブ サブプロセスには引き継がれません。
また、システム全体を書き直して、C++ プロセスがそのようなリモート要求を Java の親に委任できるようにすることも考えています。しかし、私が本当に望んでいたのは、バックグラウンドの C++ アプリケーションが単独でインターネットにアクセスできるようにする方法を見つけることでした。
これは、その C++ コードが実際には比較的複雑な Linux アプリケーションのポートであり、「Android アプリ」が UI として機能するためです。このアーキテクチャを拡張して、ネイティブ アプリが Android アプリをインターネットへのプロキシとして使用するようにすることもできますが、その必要はありません。ただし、これまでのところ、カーネルを再コンパイルする以外に、ネイティブ アプリがネットワーク スタックに直接アクセスできるようにする方法を見つけられませんでした (このアプリケーションはストック Android デバイスで実行する必要があるため、私の場合はオプションではありません)。
助言がありますか?