我正在开发一个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
添加到其Manifest才能访问Internet资源。我已经完成了我的Android应用程序,但显然这个权限不会延续到从Java代码中生成的本机子进程。
我还认为我可以重写整个系统,因此C ++进程会将这些远程请求委托给它的Java父级。但我真正想要的是找到一种方法来允许后台C ++应用程序自己访问Internet。
这是因为C ++代码实际上是一个相对复杂的Linux应用程序的端口,“Android app”作为UI工作。我可能扩展此架构,因此本机应用程序将使用Android应用程序作为Internet的代理,但我宁愿不必;但到目前为止,我还没有找到一种方法来启用本机应用程序直接访问网络堆栈,而不是重新编译内核(在我的情况下,这不是一个选项,因为此应用程序必须在现有的Android设备中运行)。
有什么建议吗?