我一直在进行低级别的Android编程(使用CodeSourcery工具链的本地C/C++),我在模拟器上试过可执行文件,它可以运行。我想在真实设备上尝试一下。于是我插入我的Nexus并将文件推送到文件系统上,然后尝试执行二进制文件,但是出现了权限错误。无论我如何挂载它或将其发送到何处,我都不是root用户,无法执行它。有没有任何办法可以让非ROOT手机运行这样的程序?
我一直在进行低级别的Android编程(使用CodeSourcery工具链的本地C/C++),我在模拟器上试过可执行文件,它可以运行。我想在真实设备上尝试一下。于是我插入我的Nexus并将文件推送到文件系统上,然后尝试执行二进制文件,但是出现了权限错误。无论我如何挂载它或将其发送到何处,我都不是root用户,无法执行它。有没有任何办法可以让非ROOT手机运行这样的程序?
更新:请注意,目标API级别为29(Android 10)及以上的应用程序将无法使用下面的技巧,因为操作系统将限制执行权限。请参见行为更改:目标API 29+。
在使用Android NDK中提供的工具链编译二进制文件后,您可以将它们与典型的Android应用程序打包,并将它们作为子进程生成。
您需要在应用程序的assets文件夹中包含所有必要的文件。为了运行它们,您必须让程序将它们从assets文件夹复制到可运行位置,例如:/data/data/com.yourdomain.yourapp/nativeFolder。
以下是示例代码:
private static void copyFile(String assetPath, String localPath, Context context) {
try {
InputStream in = context.getAssets().open(assetPath);
FileOutputStream out = new FileOutputStream(localPath);
int read;
byte[] buffer = new byte[4096];
while ((read = in.read(buffer)) > 0) {
out.write(buffer, 0, read);
}
out.close();
in.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
请记住,assetPath 不是绝对路径,而是相对于 assets/ 的路径。
例如:“assets/nativeFolder” 只是 “nativeFolder”。
然后,要运行应用程序并读取其输出,您可以执行以下操作:
Process nativeApp = Runtime.getRuntime().exec("/data/data/com.yourdomain.yourapp/nativeFolder/application");
BufferedReader reader = new BufferedReader(new InputStreamReader(nativeApp.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
// Waits for the command to finish.
nativeApp.waitFor();
String nativeOutput = output.toString();
File
对象,请确保将新的(复制的)二进制文件标记为可执行:mBin.setExecutable(true);
。 - jpalm
/data/local/tmp/
,然后添加+x
权限,它就会运行。不作为答案发布,因为这仅适用于少数设备。 - Mark K Cowan