android - 将 MotionEvent 从 Java 发送到 JNI

标签 android java-native-interface

是否可以通过 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);

最佳答案

我知道 AInputEventMotionEvent 是不同的类型,不能相互转换,所以我将 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/

相关文章:

使用 HTML 呈现 Android WebView

javascript - 在android webview中拦截request多个http请求

java - 将字符串的数组列表从 native java 返回到 JNI

java-native-interface - Kotlin/Native 自己能用吗?

c++ - 为什么当我返回堆分配对象而不是堆栈分配对象时会调用复制构造函数?

java - 共享首选项。安卓、Java

android - 如何制作像谷歌播放的图像 slider

android - 谷歌地图 : Embedding multiple locations and directions on a mobile app

java - JNI 将 Java double 转换为 jdouble 时遇到问题

c++ - Gradle cpp 插件不链接共享库