新手-99 2023-06-09 19:33 采纳率: 79.3%
浏览 63
已结题

安卓开发,JNI如何使用ROOT权限运行

JNI中的CPP函数如何以ROOT身份运行?
如题,在CSDN提问之前,我已经查了很多资料,总结有以下几种方法:

  1. 用java的Runtime.getRuntime.exec("su -c " + "myJniPath");
    实验发现,这种方法没用,即使在清单文件加了所需的权限。

  2. 在cpp函数中需要用到超级权限之前:system("su");
    经实验无用。

  1. 使用面具作者提供的libsu轮子,使运行的程序具有su权限。
    这个过于复杂,一时间看不懂,希望能看懂的给讲一下,库地址:https://github.com/topjohnwu/libsu

  2. 向GPT提问。
    这个就有得搞了,提问了不少于三十次,每次都要改代码试验一下,但是AI提供的方法没有一个是有效的。

我的cpp函数也不复杂,就是跨进程读内存值的,在优化过的多开框架运行可以顺利读取,但是在ROOT机器上运行却无法读取,返回值为127,这个值好像是读取进程失败的意思。哪位同学能给提供下思路和解决方案。

  • 写回答

1条回答 默认 最新

  • IT论之程序员 2023-06-10 11:01
    关注
    1. 在C++代码中直接调用系统命令获得ROOT权限。你可以调用system("su")或popen("su -c 命令")等方式获得ROOT权限执行操作。
    2. 使用libsu库。这个库封装了获得ROOT权限的操作,你可以引用这个库调用其API获得ROOT权限。不过这个库比较复杂,需要仔细研究。
    3. 在Java层使用Runtime.getRuntime().exec("su -c 命令")启动一个子进程执行C++函数。不过你说这个方法无效,可能是权限配置的问题。你需要在AndroidManifest.xml加上root权限:
      xml 并确保你的设备已获得ROOT权限。
    4. 不使用ROOT权限,通过其他方式实现跨进程内存读取。比如:
    • 使用Ashmem内存共享让其他进程映射读取
    • 使用Socket通信,在C++函数中读取内存数据发送给Java层
    • 使用Messenger通信,发送读取内存请求给C++层,在C++层读取并回传数据
      这些方式无需ROOT权限就可以实现跨进程通信和数据读取。
      总的来说,获得ROOT权限实现你的需求是一种方案,但是也存在一定风险。我更推荐你使用标准的Android IPC机制实现跨进程数据读取,这种方式更加稳定和安全。
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月29日
  • 修改了问题 7月9日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗