2013-01-04 3 views
4

파일 설명에 동의 LIBUSB : FD 내가수정은 다음과 같이 내가 libusb1.0 open 함수를 수정

를 호출 할 때 Unfortunatelly 내가 오류가 계속 android.hardware.usb.UsbDeviceConnection.html#getFileDescriptor()

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

을 통해 얻은

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); 
} 

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 인터페이스가 실패했습니다. 오류 -1 errno 9

"잘못된 파일 번호"로 번역됩니다. Java에서 얻은 파일 설명자는 양의 정수입니다.

유일한 다른 세부 사항은 내 원시 코드가 Java ProcessBuilder로 생성 된 별도의 바이너리로 실행된다는 것입니다. 하지만 그들은 같은 uid를 공유하기 때문에 나는 자바로부터받은 USB 권한이 여전히 libusb에 적용되어야한다고 생각합니다.

나는 플랫폼에 독립적 일 필요가없는, 그래서 어떤 해킹 작업 : 어떤 생각이 많이 주시면 감사하겠습니다

할 것입니다!

추가 정보! 내가 lsof를 에서 얻을 출력은 제가 my_exe에 전달 파일 기술자 (44)가 실제로 상속이 아니라고 생각한다

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 

(그것의 가장 흥미로운 부분을 강조 단축)입니다!

답변

7

파일 설명자가 프로세스에서 상속되지 않았 음이 밝혀졌습니다. JNI를 사용하는 경우에는 모든 것이 좋지만 타사 응용 프로그램과 인터페이스하려는 경우 파일 설명자를 타사 응용 프로그램으로 전송해야합니다.

내 솔루션은 use UNIX sockets이며, JNI를 통해 fd를 전송하면 성공했습니다.

P.

본인은 GNU 라이센스로 프로젝트를 발표 - https://github.com/martinmarinov/rtl_tcp_andro-

+0

나는 유닉스 소켓을 사용하여 파일 기술자를 전달하지만 불행히도 나는 항상 LIBUSB_ERROR_BUSY를 얻고있다. fd는 양수이므로 좋을 것 같습니다. 안드로이드 애플 리케이션 난 그냥 장치를 열고 인터페이스를 요구하지 않습니다. 나는 pid/vid를 사용하여 검색 할 때 올바른 장치를 열어야한다. 뭐가 문제 야? – 4ntoine

0

파일 핸들은 프로세스에 대해 비공개입니다. 그 (것)들을 다른 과정에 통과하는 것은 * nix의 어떤 풍미든지에 작동하지 않을 것이다.

Android의 Binder/Parcel IPC 인터페이스는 파일 설명자를 정렬 할 수 있습니다.

핸들을 상속받을 수 있습니다. 프로세스가 생성 될 때 이미 열려있는 경우 핸들은 생성 된 프로세스에서도 유효합니다.

+0

예, 핸들러가 먼저 획득 한 후 프로세스가 양산된다. 시스템에 "파일 x에 대해 이미 가지고있는 처리기를 제공하십시오"또는 "프로세스에 열려있는 모든 처리기의 목록을 제공하십시오"라고 말할 수있는 방법이 있습니까 –

+0

lsof를 발견했습니다. 업데이트 된 질문을 볼 수 있습니다 –