是否可以通过 JNI 将 MotionEvent
从 Java 发送到 C++?
我在 C++ 中有一个方法应该接收指向 AInputEvent 的指针以将其发送到 Game 类:
JNIEXPORT void JNICALL
Java_com_game_ActivityMain_onTouch(JNIEnv *jenv, jclass obj,jobject event) {
AInputEvent* inputEvent=(AInputEvent*)event;
game->OnInput(inputEvent);
}
};
在 Java 中,我将 native 方法声明为:
public static native void onTouch(MotionEvent event);
但是当我在屏幕上切换时应用程序崩溃了。
编辑:
我想这不可能完成,因为 Java TouchEvent
和 JNI AInputEnvent
不是同一类型。那我该怎么办呢?
编辑 2: 我在 JNI 端创建了一个结构并通过调用方法填充它的字段,这是最好的方案吗?
jclass eventClss=jenv->GetObjectClass(event);
jmethodID methodId = jenv->GetMethodID(eventClss, "getX", "()F");
float x = jenv->CallFloatMethod(event, methodId);
最佳答案
我知道 AInputEvent
和 MotionEvent
是不同的类型,不能相互转换,所以我将 MotionEvent
作为 >jobject
并使用 JNI 环境
访问它的方法和字段。
JNIEXPORT void JNICALL
Java_com_game_ActivityMain_onTouch(JNIEnv *jenv, jclass obj,jobject motionEvent) {
jclass motionEventClass=jenv->GetObjectClass(motionEvent);
jmethodID pointersCountMethodId = jenv->GetMethodID(motionEventClass,"getPointerCount", "()I");
int pointersCount = jenv->CallIntMethod(motionEvent, pointersCountMethodId);
jmethodID getActionMethodId = jenv->GetMethodID(motionEventClass, "getAction", "()I");
int32_t action = jenv->CallIntMethod(motionEvent, getActionMethodId);
jmethodID getXMethodId = jenv->GetMethodID(motionEventClass, "getX", "(I)F");
float x0 = jenv->CallFloatMethod(motionEvent, getXMethodId,0);
jmethodID getYMethodId = jenv->GetMethodID(motionEventClass, "getY", "(I)F");
float y0 = jenv->CallFloatMethod(motionEvent, getYMethodId,0);
float x1=0;
float y1=0;
if(pointersCount>1){
x1 = jenv->CallFloatMethod(motionEvent, getXMethodId,1);
y1 = jenv->CallFloatMethod(motionEvent, getYMethodId,1);
}
States::MotionEvent inputEvent;
inputEvent.PointersCount=pointersCount;
inputEvent.Action=action;
inputEvent.X0=x0;
inputEvent.Y0=y0;
inputEvent.X1=x1;
inputEvent.Y1=y1;
game->OnMotionEvent(inputEvent);
}
关于android - 将 MotionEvent 从 Java 发送到 JNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57828868/