3

我有一个由本机部分和更高层组成的应用程序。

因此,需要授予它 root 权限才能运行一些本机功能。

正如我之前发布的文章,我添加了一段取自 Bluez Utils(hidd.c) 的代码。

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    close(sk);
    return -1;
   }

该代码已由 NDK 构建为 .so。

不幸的是,它一直返回 -1 并且 errno 是 13,这意味着 Permission Denied。

一些经验丰富的开发人员(在此感谢您)提到该错误的发生是因为此应用程序没有足够的权限。

它“不应该”类似于

进程进程 = Runtime.getRuntime().exec("su");

我认为这意味着您拥有系统权限,但您的应用程序没有。(如果我错了,请告诉我)

有什么方法可以授予应用程序具有 root 权限?

任何回复/线索/提示将不胜感激。

问候-

山姆

4

2 回答 2

1

我想我可以帮你解决这个问题。

在这里,我们咕...

void gainRoot()
{
    Process chperm;
    try {
        chperm=Runtime.getRuntime().exec("su");
          DataOutputStream os = 
              new DataOutputStream(chperm.getOutputStream());
            os.writeBytes("chmod 777 /dev/video0\n");
            os.flush();

            os.writeBytes("exit\n");
            os.flush();

            chperm.waitFor();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

这是我通常用来更改根文件权限的功能。

当您执行 su 时,将使用 root 权限创建一个新进程。因此,使用此 Process 您可以执行任何 root 操作。有一些特定的语法需要遵循。如上例所示。

因此,您可以做的一件事是将代码的绑定部分构建为单独的可执行文件,并将其放在 system/bin 或通常保存可执行文件的地方。假设可执行文件的名称是 bind123 那么而不是

            os.writeBytes("chmod 777 /dev/video0\n");
            os.flush();

将其替换为

            os.writeBytes("bind123\n");
            os.flush();

在上面的代码中。

这应该有效。可能一旦它工作了,我们可以尝试将它与应用程序集成,而不依赖于可执行文件。我希望我没有让你感到困惑。如果需要明确一点,请告诉我ww .... 一切顺利...

于 2012-04-18T09:16:28.523 回答
0

您不需要 root 绑定到端口 >=1024。您只需要ApplicationManifest.xml文件中的INTERNET权限。

于 2012-04-18T06:39:03.193 回答