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으로하고 싶습니다.
Android에서이 작업을 수행하는 것이 올바른 방법입니까? 이것이 뿌리를 휴대 전화가 필요하지 않을까요? – hyde
@hyde : 예이 경우 뿌리가 쳐진 전화가 필요합니다. –
아니요, 아니요, 아니요. root에 사용자를 추가하거나 오랫동안 root가되지 마십시오. 아주 나쁜 습관. – kyb