是否可以使用NDK创建UI元素? - Android文档中缺少规范

use*_*079 10 user-interface android native android-ndk native-activity

在阅读相关文档之后,如果我只使用NDK编译的C++/C代码就可以创建用于获取用户输入的按钮或其他UI元素之类的内容.

当我想处理需要保持关注的"窗口"或活动时没有问题,但我不知道如何构建具有回调和用户输入元素的UI.

奇怪的是,有一个窗口框架,但没有任何UI元素回调的痕迹.

我可以使用NDK构建触摸按钮或虚拟游戏手柄吗?


我很欣赏我们的努力和事实,我们越来越接近我的观点,但显然我并没有解释自己足够好.

我在这里找到了这张图片 在此输入图像描述

现在我的问题和这个问题的焦点是:

假设我可以把和得出这样的虚拟摇杆,我怎么能只检测运动并有一个回调像Joystick.onUpJoystick.onDownAndroid和仅使用NDK?

如果NDK没有这种回调,我应该每次检测[x,y]位置,将其与我操纵杆的位置进行比较,存储前一个位置,比较前一个位置和下一个位置得到方向?

由于传感器以非常快的速度抛出事件,我认为仅考虑原始的X,Y耦合,我自己构建这个将最终导致一个非常低效的控制系统,因为它不会在适当的操作系统级别进行优化传感器呼叫.

根据NativeActivity示例,还不清楚如何处理多个触摸点,例如我如何同时处理2个触摸事件?

只需考虑上面的图像,并考虑只有1个触点的x,y坐标,以及如何以NDK支持的有效方式解决这个问题.

谢谢.

Sev*_*yev 12

你当然可以.阅读从C(++)调用Java,并调用相应的Java函数 - 逐个构造UI元素(布局,按钮等),或加载XML布局.没有特定于C的接口,但Java可以调用.

除非它是一个游戏,你打算通过OpenGL ES做自己的绘图.我不确定你是否可以混搭.

NativeActivity,你仍然可以得到一个指针的Java Activity对象,并调用它的方法-这是clazz对的成员ANativeActivity则传递到您的结构android_main作为参数,通过android_app结构.拿起那个指针,JNIEnv*从中获取相同的指针,并指定一个布局.

如何与OpenGL绘图进行互操作,我不确定.

编辑:关于整理自己的输入处理.关键回调是onInputEvent(struct android_app* app, AInputEvent* event)android_app结构内.将回调放在那里,Android会在适当的时候调用它.使用AInputEvent_getType(event)检索事件类型; 触摸事件的类型为AINPUT_EVENT_TYPE_MOTION.

EDIT2:这是抓取触摸事件的最小原生应用:

#include <jni.h>
#include <android_native_app_glue.h>
#include <android/log.h>

static int32_t OnInput(struct android_app* app, AInputEvent* event)
{
    __android_log_write(ANDROID_LOG_ERROR, "MyNativeProject", "Hello input event!");
    return 0;
}

extern "C" void android_main(struct android_app* App)
{
    app_dummy();
    App->onInputEvent = OnInput;

    for(;;)
    {
         struct android_poll_source* source;
         int ident;
         int events;

         while ((ident = ALooper_pollAll(-1, NULL, &events, (void**)&source)) >= 0)
         {
             if(source != NULL)
                 source->process(App, source);

             if (App->destroyRequested != 0)
                     return;
         }
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,您需要在其周围添加一个项目,包括清单,Android.mk和所有内容.Android.mk将需要以下作为最后一行:

$(call import-module,android/native_app_glue)
Run Code Online (Sandbox Code Playgroud)

native_app_glue是一个静态库,为通常通过Java使用的API提供一些C桥接.

你也可以在没有胶水库的情况下完成.但是,你需要提供自己的功能ANativeActivity_onCreate,以及一堆其他的回调.的android_main/ android_app组合是由胶库中定义的接口.

编辑:对于触摸坐标,使用AMotionEvent_getX/Y(),将事件对象作为第一个参数传递,将指针的索引作为第二个参数传递.使用AMotionEvent_getPointerCount()检索指针(接触点)的数量.这是您对多点触控事件的原生处理.

我应该每次检测[x,y]位置,将它与我操纵杆的位置进行比较,存储前一个位置,比较前一个位置和下一个位置以获得方向?

简而言之,是的,你是.虚拟操纵杆没有内置平台支持; 你处理触摸和坐标,并将其转换为你的应用程序的UI比喻.这几乎是编程的本质.

不是"每次都" - 只有在它发生变化时.Android是一个事件驱动的系统.

现在,关于你的"我希望它在操作系统级别"的情绪.这在许多层面都是错误的.首先,操作系统不欠你任何东西.操作系统就是这样,接受或离开它.其次,不愿意扩展努力(AKA懒惰)在软件社区中通常是不受欢迎的.第三,OS代码仍然是代码.将某些内容移入操作系统可能会获得一些效率,但为什么您认为它会使用户产生明显的差异?这是我们谈论的触摸处理 - 不是特别CPU密集型任务.你真的构建了一个应用程序,个人资料并找不到它的表现吗?在你做之前,不要猜测瓶颈会在哪里.这个词就是"过早优化",这是每个人和他们叔叔的猫会警告你的东西.

  • 这是通常的方法,我问的是 100% 的本地活动;所以我需要使用 JNI 而我无法避免这种情况?假设我有 C/C++ 引擎的代码库,你的提示是关于使用 JNI 调用 java 函数?在这种情况下,我的应用程序的入口点是什么?Java 还是 C/C++?我想在这种情况下,我必须使用 Java 构建整个 UI,包括窗口,所以我的入口点是 Java 代码,但是如何将 EGL 本机缓冲区与 Java 连接呢?我明白你的提示,但我不清楚具体的实现,特别是对于 EGL 缓冲区部分。 (2认同)
  • 我一直在谈论 NativeActivity,我只想处理我的 C/C++ 代码库,只处理 NDK,你能确认或调整你的答案吗?NDK 语言和 NDK 示例都使用术语 NativeActivity,所以对于原生我的意思是 100% C/C++。现在你能澄清一下吗,我会在其他问题中询问 EGL 吗?同样,有机会仅使用 NDK 构建 UI 回调吗?是的,它是关于游戏或与 OpenGL 相关技术类似的东西。 (2认同)
  • `&lt;ndk root&gt;/samples/native-activity`:我可以用这样的代码构建一个 UI 吗? (2认同)