1)不,除了访问系统文件并因此需要root用户的约束之外,应该没有约束。最好的地方是直接到达/ data / data /
[your_package_name],以避免污染其他地方。
2)可以在这里找到有关针对本机库进行编译的非常详尽的讨论:http : //www.aton.com/android-native-libraries-
for-java-applications/。另一个选择是arm的交叉编译器(这是用于编译内核的交叉编译器,它是免费的:http
:
//www.presourcery.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()来检查文件是否存在,如果文件不存在,则可以执行所有这些命令。
让我知道它是否有效。祝好运!



