我正在开发一个 Java Android 应用程序,它将一个普通的 C++ 应用程序打包为一个资产。在执行期间,Android 应用程序将 C++ 二进制文件提取到其私有文件系统子文件夹中,使用 将其作为后台进程运行java.lang.ProccessBuilder
,然后设置用于双向通信的套接字。
只要本机进程只想与其 Java 父进程通信,套接字连接就可以正常工作。问题是当本机进程尝试打开到远程服务器的套接字连接时,例如网站域。在这种情况下,对 POSIX 函数的调用int connect(int socket, const struct sockaddr *address, socklen_t address_len)
会失败并显示错误代码ENETUNREACH
(没有到网络的路由)。
我知道 Android 应用程序必须android.permission.INTERNET
在其清单中添加权限才能访问 Internet 资源。我已经对我的 Android 应用程序执行了此操作,但显然此权限不会延续到从 Java 代码生成的本机子进程。
我还认为我可以重写整个系统,以便 C++ 进程将此类远程请求委托给其 Java 父级。但我真正想要的是找到一种方法,让后台 C++ 应用程序自行访问 Internet。
这是因为 C++ 代码实际上是一个相对复杂的 Linux 应用程序的端口,“Android 应用程序”作为 UI 工作。我可以扩展这个架构,以便原生应用程序使用 Android 应用程序作为 Internet 的代理,但我宁愿不必这样做;但是到目前为止,我还没有找到一种方法可以让本机应用程序直接访问网络堆栈,而不是重新编译内核(在我的情况下这不是一个选项,因为这个应用程序必须在库存的 Android 设备中运行)。
有什么建议么?