当前位置: 首页 > 面试题库 >

在Android应用程序中托管可执行文件

骆英纵
2023-03-14
问题内容

我正在开发一个依赖ELF二进制文件的Android应用程序:我们的Java代码与此二进制文件进行交互以完成任务。需要在应用程序启动和应用程序退出/根据需要启动和终止此运行时。

问题:

  1. 我假设我们将能够使用Runtime.exec()API执行此二进制文件。是否需要将库放在文件夹结构中的任何限制?系统运行时如何找到该可执行文件?是否有某种类路径设置?

  2. 由于应用程序依赖于此运行时,因此我考虑将其包装在服务周围,以便可以根据需要启动或停止它。在Android项目中处理此类可执行文件的最佳方法是什么?

  3. 假设我没有此可执行文件的源代码,还有哪些其他选择?

请指教。

谢谢。


问题答案:

1)不,除了访问系统文件并因此需要root用户的约束之外,应该没有约束。最好的地方是直接到达/ data / data /
[your_package_name],以避免污染其他地方。

2)可以在这里找到有关针对本机库进行编译的非常详尽的讨论:http : //www.aton.com/android-native-libraries-
for-java-applications/
。另一个选择是arm的交叉编译器(这是用于编译内核的交叉编译器,它是免费的:http
:
//www.codesourcery.com/sgpp/lite/arm)。如果您打算维护执行cammand的服务,请注意,Android随时可以停止和重新启动服务。

3)现在,如果您没有源代码,我希望您的文件至少可以编译为arm可执行文件。如果没有,我什至看不到如何运行它。

您将通过在Java类中运行以下命令来执行文件:

String myExec = "/data/data/APPNAME/FILENAME";
Process process = Runtime.getRuntime().exec(myExec);
DataOutputStream os = new DataOutputStream(process.getOutputStream());
DataInputStream osRes = new DataInputStream(process.getInputStream());

我对您的可执行文件一无所知,因此您可能需要也可能不需要实际获取inputStream和outputStream。

我假设运行adb来推送二进制文件是不可能的,所以我一直在寻找一种打包方式。我发现了一篇很棒的文章,关于在您的应用程序中包含可执行文件。在此处查看:http
:
//gimite.net/en/index.php?Run%20native%20executable%20in%20Android%20App

重要的部分是这一部分(重点是我的):

在Android Java应用中,使用assets文件夹

  • 在资源文件夹中包含二进制文件。
  • 使用getAssets().open(FILENAME)获得的InputStream
    * 将其写入/data/data/APPNAME(例如/data/data/net.gimite.nativeexe),您的应用程序可以访问其中的文件并使其可执行。
  • /system/bin/chmod 744 /data/data/APPNAME/FILENAME使用上面的代码运行。
  • 使用上面的代码运行可执行文件。

帖子使用的assets文件raw夹是android建议的静态文件文件夹:

提示:如果要在编译时将静态文件保存在应用程序中,请将该文件保存在项目res / raw
/目录中。您可以通过传递R.raw的openRawResource()打开它。资源ID。此方法返回一个InputStream,您可以使用该InputStream来读取文件(但不能写入原始文件)。

要访问数据文件夹,您可以按照此处的说明进行操作:http : //developer.android.com/guide/topics/data/data-
storage.html#filesInternal
此外,还有一些File#setExecutable(boolean);方法可以代替shell命令起作用。

因此,将所有内容放在一起,我会尝试:

InputStream ins = context.getResources().openRawResource (R.raw.FILENAME)
byte[] buffer = new byte[ins.available()];
ins.read(buffer);
ins.close();
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(buffer);
fos.close();


File file = context.getFileStreamPath (FILENAME);
file.setExecutable(true);

当然,所有这些在安装后应该只执行一次。您可以在内部进行快速检查,也可以通过快速检查onCreate()来检查文件是否存在,如果文件不存在,则可以执行所有这些命令。

让我知道它是否有效。祝好运!



 类似资料:
  • 我想在spring应用程序中使用ManagedExecutorService。然而,spring无法注入它。降低误差。 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到 [javax.enterprise.concurrent.ManagedExecutorService] 类型的合格 bean,用于依赖关

  • 我正在使用angular框架构建前端应用程序。有没有办法,我如何将应用程序部署到Azure Linux应用程序服务? 我已经用NodeJS堆栈创建了Web应用程序,并将其分配给Linux应用程序服务。我用命令构建了我的angular应用程序,并将其部署到这个web应用程序中。当我使用url:

  • 我正在开发一个应用程序,将工作在两个不同的Android环境(消费者和企业市场)。假设它是一个短信应用程序,需要管理一打配置参数。 第一个环境是一个标准的Android设备,它没有启用Android Enterprise(AfW)功能。因此没有EMM(MDM)来提供Android代理/客户端应用程序作为实现托管配置提供程序的设备/配置文件所有者。 第二个环境是公司内部。EMM(MDM)用于管理所有

  • 我有一个WCF服务,我试图在Sitecore 7.1应用程序中托管。具有相同配置的Web服务在空白Asp.net应用程序中托管时运行良好。但是当尝试从Sitecore应用程序运行它时,它不起作用(下面的错误)。我也尝试了这些解决方案,但没有运气。我不确定它们是否应该适用于最新版本的Sitecore。 https://adeneys.wordpress.com/2008/10/17/make-sit

  • 问题内容: Android基于Linux;本机Linux应用程序可以在Android上运行吗? 问题答案: 一般来说,没有。Android应用程序通常在类似于Java的沙盒虚拟机中运行,因此必须使用Java或编译为使用Android API的虚拟机字节码的某种语言编写。 但是,虚拟机确实可以在基础Linux操作系统上运行,并且有多种方法可以调用本机代码。参见https://developer.an

  • 但是所有的答案和评论对链接帖子的回应也没有太大帮助