2014-12-09 8 views
0

나는 안드로이드 응용 프로그램을 만들기 위해 가짜 가상 장치를 만들기 위해 장치를 뿌리 뽑아야하고 uinput 모듈이 필요합니다.안드로이드 ndk의 잘못된 유형 변환

내 자바 코드 내부

static{ System.loadLibrary("myModule"); } 
CreateVirtualDevice("Devname",0x123,0x123); 

를 호출 장치를 만들려면 다음 코드를 사용하고 있습니다. 여기 네이티브 코드 : 디바이스가 성공적으로 생성

#include <string.h> 
#include <jni.h> 
#include <fcntl.h> 

#include <linux/input.h> 
#include <linux/uinput.h> 

static int fd; 
static struct uinput_user_dev dev; 

short int analog_axis_list[] = { ABS_X,ABS_Y,ABS_RX,ABS_RY, -1}; 

jint Java_com_example_app_MyClass_CreateVirtualDevice(
     JNIEnv* env, jobject thiz, jstring param, jint param2, jint param3) { 

    int i; 

    memset(&dev, 0, sizeof(dev)); 
    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); 
    if (fd < 0) 
     return -1; 
    if(ioctl(fd, UI_SET_EVBIT, EV_ABS)<0) return -4; 


    for(i=0;analog_axis_list[i]>=0;i++){ 
     if(ioctl(fd,UI_SET_ABSBIT,analog_axis_list[i])<0) return -5; 
     dev.absmax[analog_axis_list[i]]=32767; 
     dev.absmin[analog_axis_list[i]]=-32768; 
    } 

    const char *cparam = (*env)->GetStringUTFChars(env, param, 0); 
    snprintf(dev.name, UINPUT_MAX_NAME_SIZE, cparam); 
    (*env)->ReleaseStringUTFChars(env, param, cparam); 
    dev.id.bustype = BUS_VIRTUAL; 
    dev.id.vendor = param2; 
    dev.id.product = param3; 
    dev.id.version = 1; 

    if (write(fd, &dev, sizeof(dev)) < 0) 
     return -7; 

    if (ioctl(fd, UI_DEV_CREATE) < 0) 
     return -8; 
    return 0; 

} 

, 반환 값은 0으로 ABS 값 이렇게 정의 input.h 내부 이다

#define ABS_X 0x00 
#define ABS_Y 0x01 
#define ABS_RX 0x03 
#define ABS_RY 0x04 

을하지만 안드로이드 축을 확인할 때 , 나는 AXIS_X 및 AXIS_Y에 대한 적절한 값을 얻지 만 ABS_RX 및 ABS_RY 값이 잘못되었습니다. 나는 축 값을 확인하려면이 코드를 사용 :

InputDevice device = InputDevice.getDevice(ids[position]); 
List<InputDevice.MotionRange> ranges = device.getMotionRanges(); 
StringBuilder sb = new StringBuilder(""); 
if(ranges.size()==0){ 
    sb.append("NO_MOTION_RANGES"); 
} 
else{ 
    int i = 0; 
    for(InputDevice.MotionRange range:ranges) { 
     if(i>0) { 
      sb.append(","); 
     } 
     sb.append(MotionEvent.axisToString(range.getAxis())); 
     sb.append("(").append(range.getAxis()).append(")"); 
     i++; 
    } 
} 
return sb.toString(); 

을 그리고 그 결과는 다음과 내가 사용할 특별한 설정없이 최신 NDK 릴리스 (r10d)를 사용하고

AXIS_X(0),AXIS_Y(1),AXIS_Z(11),AXIS_RZ(14) 

. 이러한 오류의 원인은 무엇입니까?

나는 실제 컨트롤러에서 축 번호가 정확하기 때문에 잘못된 것이 있다고 내 코드가 지적하고 싶습니다.

편집 1 : 나는 돌아하려 analog_axis_list [2] 대신 0 내 함수의 끝에서, ABS_RX이며이 3 반환, 그래서 내가 ioctl에 잘못된 유형을 전달 있다고 생각하는 요구. 어떤 유형을 선택해야합니까?

+0

*** [ioctl()] (http://man7.org/linux/man-pages/man2/ioctl.2.html) *** 프로토 타입입니다 :'int ioctl (int d, unsigned long request , ...);'. 그러나 코드 스 니펫 전체가 아니라면 대부분의 반환 값을 살펴 보지 않았습니다. 값 (인수)이 올바르게 등록되고 있는지 확인하십시오. – ryyker

+0

@ryyker 모든 ioctl 호출에 대한 검사를 추가하면 함수는 0을 반환합니다. – Vektor88

답변

0

안드로이드는 오른쪽 스틱에 AXIS_Z 및 AXIS_RZ를 사용합니다. 이것은 USB HID와 일치합니다.