Android アプリケーションで偽の仮想デバイスを作成する必要があります。これを実現するには、デバイスをルート化する必要があり、uinput モジュールが必要です。
次のコードを使用してデバイスを作成し、呼び出しています
static{ System.loadLibrary("myModule"); }
CreateVirtualDevice("Devname",0x123,0x123);
私のJavaコード内。ネイティブコードは次のとおりです。
#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 です。内部input.h
のABS
値は次のように定義されています。
#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_RX 0x03
#define ABS_RY 0x04
しかし、Android で軸を確認すると、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();
結果は次のとおりです。
AXIS_X(0),AXIS_Y(1),AXIS_Z(11),AXIS_RZ(14)
特定の設定を有効にせずに、最新の NDK リリース (r10d) を使用しています。これらのエラーの原因は何ですか?
実際のコントローラーでは軸番号が正しいため、何か間違っているのは私のコードであることを指摘したいと思います。
編集 1:
analog_axis_list[2] を返そうとしABS_RX
ました . どのタイプを選ぶべきですか?0
3
ioctl