gpt4 book ai didi

android - 修改 libusb 以接受文件描述符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:51 26 4
gpt4 key购买 nike

我修改了libusb1.0的open函数如下:

static int op_open2(struct libusb_device_handle *handle, int fd) {
struct linux_device_handle_priv *hpriv = _device_handle_priv(handle);

hpriv->fd = fd;

return usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT);
}

fd 是通过 android.hardware.usb.UsbDeviceConnection.html#getFileDescriptor() 获得的

final UsbDeviceConnection connection = manager.openDevice(device); 
return connection.getFileDescriptor();

不幸的是,我在调用时一直收到错误

static int op_claim_interface(struct libusb_device_handle *handle, int iface)
{
int fd = _device_handle_priv(handle)->fd;

int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface);

if (r) {
if (errno == ENOENT)
return LIBUSB_ERROR_NOT_FOUND;
else if (errno == EBUSY)
return LIBUSB_ERROR_BUSY;
else if (errno == ENODEV)
return LIBUSB_ERROR_NO_DEVICE;

usbi_err(HANDLE_CTX(handle),
"claim interface failed, error %d errno %d", r, errno);
return LIBUSB_ERROR_OTHER;
}
return 0;
}

claim接口(interface)失败,error -1 errno 9

翻译为“错误的文件编号”。我从 Java 获取的文件描述符是一个正整数!

唯一的其他小细节是我的 native 代码作为一个单独的二进制文件运行,该二进制文件由 Java ProcessBuilder 生成。但是它们共享相同的 uid,所以我认为我从 Java 获得的 USB 权限应该仍然适用于 libusb。

我不需要独立于平台,所以任何 hack 都可以完成这项工作:)

如有任何想法,我们将不胜感激!

补充信息!我从 lsof 得到的输出是(缩短以强调其中最有趣的部分)

my.activity 13374     u0_a62  exe       ???                ???       ???        ??? /system/bin/app_process
my.activity 13374 u0_a62 0 ??? ??? ??? ??? /dev/null
my.activity 13374 u0_a62 1 ??? ??? ??? ??? /dev/null
my.activity 13374 u0_a62 2 ??? ??? ??? ??? /dev/null
my.activity 13374 u0_a62 3 ??? ??? ??? ??? /dev/log/main
my.activity 13374 u0_a62 4 ??? ??? ??? ??? /dev/log/radio
my.activity 13374 u0_a62 5 ??? ??? ??? ??? /dev/log/events
my.activity 13374 u0_a62 6 ??? ??? ??? ??? /dev/log/system
my.activity 13374 u0_a62 7 ??? ??? ??? ??? /system/framework/core.jar
my.activity 13374 u0_a62 8 ??? ??? ??? ??? /system/framework/core-junit.jar
my.activity 13374 u0_a62 9 ??? ??? ??? ??? /dev/__properties__ (deleted)
...
my.activity 13374 u0_a62 44 ??? ??? ??? ??? /dev/bus/usb/002/002
...
my.activity 13374 u0_a62 51 ??? ??? ??? ??? pipe:[51015]
my.activity 13374 u0_a62 53 ??? ??? ??? ??? pipe:[51016]
...

my_exe 13546 u0_a62 exe ??? ??? ??? ??? /data/data/my.activity/files/my_exe
my_exe 13546 u0_a62 0 ??? ??? ??? ??? pipe:[51015]
my_exe 13546 u0_a62 1 ??? ??? ??? ??? pipe:[51016]
my_exe 13546 u0_a62 2 ??? ??? ??? ??? pipe:[51016]
my_exe 13546 u0_a62 3 ??? ??? ??? ??? /dev/log/main
my_exe 13546 u0_a62 4 ??? ??? ??? ??? /dev/log/radio
my_exe 13546 u0_a62 5 ??? ??? ??? ??? /dev/log/events
my_exe 13546 u0_a62 6 ??? ??? ??? ??? /dev/log/system
my_exe 13546 u0_a62 9 ??? ??? ??? ??? /dev/__properties__ (deleted)
my_exe 13546 u0_a62 mem ??? b3:09 0 302530 /data/data/my.activity/files/my_exe
my_exe 13546 u0_a62 mem ??? b3:09 36864 302530 /data/data/my.activity/files/my_exe
my_exe 13546 u0_a62 mem ??? b3:09 40960 302530 /data/data/my.activity/files/my_exe
my_exe 13546 u0_a62 mem ??? b3:03 0 200 /system/bin/linker
my_exe 13546 u0_a62 mem ??? b3:03 57344 200 /system/bin/linker
my_exe 13546 u0_a62 mem ??? b3:03 61440 200 /system/bin/linker

这让我觉得我传递给 my_exe 的文件描述符 44 实际上不是继承的!

最佳答案

原来是文件描述符没有被进程继承。如果使用 JNI,一切都应该没问题,但如果您想与第三方应用程序交互,则需要将文件描述符传输到第三方应用程序。

我的解决方案是 use UNIX sockets通过 JNI 传输 fd 并且成功了!

附言

我在 GNU 许可证下发布了该项目 - https://github.com/martinmarinov/rtl_tcp_andro-

关于android - 修改 libusb 以接受文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com