2013-04-10 5 views
2

jni를 사용하여 내 안드로이드 애플 리케이션에서 libusb를 사용하고 있습니다. libusb를 사용하여 장치를 찾을 수 있습니다. 하지만 그것을 열 수 없습니다.libusb_open이 LIBUSB_ERROR_ACCESS를 반환합니까?

TestExP.c

#include <stdio.h> 
#include <sys/types.h> 
#include <string.h> 
#include <libusb.h> 
#include <jni.h> 

#define MY_VENDOR_ID 0xXXXX 
#define MY_PRODUCT_ID  0xXXXX 

int is_usbdevblock(libusb_device *dev) 
{ 
struct libusb_device_descriptor desc; 
int r = libusb_get_device_descriptor(dev, &desc); 

if(desc.idVendor == MY_VENDOR_ID && desc.idProduct == MY_PRODUCT_ID){ 
    return 1; 
} 

return 0; 
} 
char* mymethod() 
{ 
    libusb_device **list; 
    libusb_device *found = NULL; 
    libusb_context *ctx = NULL; 
    int attached = 0; 
    if(libusb_init(&ctx)!=0) 
     return "libusb init failed"; 

    libusb_set_debug(ctx,3); 
    ssize_t cnt = libusb_get_device_list(ctx, &list); 
    ssize_t i = 0; 
    int err = 0; 
    if (cnt < 0) 
     return "No usb device on system"; 
    for(i = 0; i < cnt; i++){ 
     libusb_device *device = list[i]; 
     if(is_usbdevblock(device)){ 
      found = device; 
     break; 
     } 
    } 
    if(found){ 
     libusb_device_handle *handle; 
     err = libusb_open(found, &handle); 
     if (err) 
      return "Open error"; 
     return "Device Opened"; 
    } 
return "Device not found"; 
} 

JNIEXPORT jstring JNICALL Java_com_example_test_Test_TestOpen(JNIEnv* env, jobject obj) 
{ 
    return mymethod(); 
} 

Android.mk 내 활동 클래스의

include $(CLEAR_VARS) 
LOCAL_MODULE := libusb-1.0 
LOCAL_SRC_FILES := libusb-1.0.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := TestExP 
LOCAL_SRC_FILES := TestExP.c 
LOCAL_SHARED_LIBRARIES += usb-1.0 
include $(BUILD_SHARED_LIBRARY) 

나는 다음을 수행 ...

test.java이

static{ 
    System.loadLibrary("usb-1.0"); 
    System.loadLibrary("TestExP"); 
} 
public native String TestOpen(); 

모든 실행 벌금. 이 프로그램을 실행하면 -3 libusb라는 오류 코드가 반환됩니다. "LIBUSB_ERROR_ACCESS" 내가 뭘 잘못하고 있는지. 어떤 사람들은 USB 장치에 퍼미션을 줄 것이라고 말합니다. Android USB-API를 사용하여 기기를 열고 기기에 연결할 수 있습니다. 하지만 libusb-1.0으로하고 싶습니다.

답변

-1

'루트'그룹에 사용자를 추가하면 모든 USB 장치 및 입력에 액세스 할 수 있습니다.

+0

Android에서이 작업을 수행하는 것이 올바른 방법입니까? 이것이 뿌리를 휴대 전화가 필요하지 않을까요? – hyde

+0

@hyde : 예이 경우 뿌리가 쳐진 전화가 필요합니다. –

+3

아니요, 아니요, 아니요. root에 사용자를 추가하거나 오랫동안 root가되지 마십시오. 아주 나쁜 습관. – kyb

1

장치를 찾아 그 VID와 기억 PID :

:

sudo gedit /etc/udev/rules.d/99-my-android-device.rules 

이 파일을 사용자의 VID와 PID와 03eb204f을 채우기 위해 다음 문자열을 입력 : 규칙 파일을 만듭니다

lsusb 

ACTION!="add|change", GOTO="my_android_device_rules_end" 
SUBSYSTEM!="usb|tty|hidraw", GOTO="my_android_device_rules_end" 

ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="204f", MODE="664", GROUP="plugdev" 

LABEL="my_android_device_rules_end" 

그룹에 추가하기 plugdev :

usermod -aG plugdev $USER 

다시 로그인하거나 다시 시작하십시오.

또한 issue에 관심이 있으실 것입니다.