나는 안드로이드 응용 프로그램을 만들기 위해 가짜 가상 장치를 만들기 위해 장치를 뿌리 뽑아야하고 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
에 잘못된 유형을 전달 있다고 생각하는 요구. 어떤 유형을 선택해야합니까?
*** [ioctl()] (http://man7.org/linux/man-pages/man2/ioctl.2.html) *** 프로토 타입입니다 :'int ioctl (int d, unsigned long request , ...);'. 그러나 코드 스 니펫 전체가 아니라면 대부분의 반환 값을 살펴 보지 않았습니다. 값 (인수)이 올바르게 등록되고 있는지 확인하십시오. – ryyker
@ryyker 모든 ioctl 호출에 대한 검사를 추가하면 함수는 0을 반환합니다. – Vektor88