Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:通过i/o重定向调用常规Java风格的程序_Android_Pipe_Io Redirection - Fatal编程技术网

Android:通过i/o重定向调用常规Java风格的程序

Android:通过i/o重定向调用常规Java风格的程序,android,pipe,io-redirection,Android,Pipe,Io Redirection,我有一个带有“publicstaticvoidmain”方法(java风格)的apk(或.class,随便什么),它可以做一些事情。编译和安装apk使其工作正常(来自eclipse) 现在,在一个普通的Android应用程序中,我想调用该代码,同时将其stdin/stdout重定向到输入/输出流对象。这可能吗?如果是的话:如何?如果没有:是否有其他方法可以在后台运行具有某种管道/io重定向构造的活动 谢谢。你可以用心去做:) 查看android开发者您可能正在为您的应用程序寻找基于服务和意图的设

我有一个带有“publicstaticvoidmain”方法(java风格)的apk(或.class,随便什么),它可以做一些事情。编译和安装apk使其工作正常(来自eclipse)

现在,在一个普通的Android应用程序中,我想调用该代码,同时将其stdin/stdout重定向到输入/输出流对象。这可能吗?如果是的话:如何?如果没有:是否有其他方法可以在后台运行具有某种管道/io重定向构造的活动


谢谢。

你可以用心去做:)


查看android开发者

您可能正在为您的应用程序寻找基于服务和意图的设计。Android的设计/架构/理念不支持进程之间的流/管道。在象棋类应用程序的情况下,UI将是一个活动,引擎可能是一个服务。对于Android来说,用户界面是最重要的,你的设计必须考虑到这一点。当进行移动时,可以将意图从UI发送到后台服务,后台服务将封装引擎代码(Java或可能通过NDK使用C)。一旦回复移动就绪,它将返回到UI活动并显示。如果您不能将所有需要的数据都放在意图中,那么您可能需要创建一个内容提供者,该提供者将允许UI获取缺少的元素。我又在考虑一款制作精良的应用程序。如果游戏逻辑不需要太长时间(或者你不需要一个完全“好”的UI体验,即离开游戏后重新启动游戏),你可以将所有内容都放在一个活动中,并使用一个异步任务/线程进行游戏逻辑。

Android绝对支持管道和unix域套接字。使用exec有点不受欢迎,但目前仍有效

有关如何执行此操作的示例,请参阅任何带有本地shell选项的android终端模拟器的源代码。从本质上讲,您的gui只是替换了终端仿真器,而您的引擎替换了shell

如果将来使用exec成为一个问题,您将需要将引擎编译为jni库,而不是独立的可执行文件。这并不一定太难——只需将其移植到ndk hello jni示例中,并使用一个调用main()的jni函数即可。从java线程调用它。像以前一样与管道通信,或者使用jni装配其他消息传递方案

请注意,“使用服务”答案也需要服务中的java包装器。目前,除非您是制作和注册系统服务的平台供应商,否则无法使用任何受支持/认可的机制制作纯本机服务


还要注意的是,您的引擎需要能够保存任何状态,同时java端需要在android活动生命周期下保存任何状态(基本上,一旦暂停,您就可以在不另行通知的情况下停止)

您想做什么?目前我想说,没有办法做那样的事情。但是如果你能指定你想做什么,也许我们可以找到一种Android的方法来做。好的,我想做的是:我有一个棋盘图形用户界面,我想与国际象棋“引擎”(组成棋步的程序)进行通信。现在我可以将我的程序编译成本地二进制文件,并使用Runtime.getInstance().exec()运行它,但我不希望为此将Java程序重写为c。因此,我正在寻找某种方式从活动中调用程序,并使用某种管道连接到它。需要更多的说明。你的“国际象棋引擎”是C语言还是Java语言?最初的问题听起来像是前端是Java,但后端不清楚。前端是Java中的常规Android应用程序,国际象棋引擎可以是Java或c,但如果c版本需要包装器,则没有问题。您可以在设备上运行用Java编写的命令行应用程序。例如,请参见dalvik/docs/hello-world.html。你能详细说明一下吗?什么是“安卓开发者”?论坛?邮寄名单?