你当然可以。阅读从 C(++) 调用 Java,并调用相应的 Java 函数 - 一个一个地构造 UI 元素(布局、按钮等),或者加载一个 XML 布局。没有特定于 C 的接口,但可以调用 Java 接口。
除非它是一款游戏,并且您打算通过 OpenGL ES 进行自己的绘图。我不确定你是否可以混合搭配。
在 aNativeActivity
中,您仍然可以获得指向 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;
}
}
}
当然,您需要围绕它添加一个项目,包括清单、Android.mk 和所有内容。Android.mk 将需要以下内容作为最后一行:
$(call import-module,android/native_app_glue)
这native_app_glue
是一个静态库,为通常通过 Java 使用的 API 提供一些 C 桥接。
你也可以在没有胶水库的情况下做到这一点。但是你需要提供你自己的 functionANativeActivity_onCreate
和一堆其他的回调。android_main
/android_app
组合是胶水库定义的接口。
编辑:对于触摸坐标,使用AMotionEvent_getX/Y()
,将事件对象作为第一个参数传递,将指针的索引作为第二个参数传递。用于AMotionEvent_getPointerCount()
检索指针(触摸点)的数量。这是您对多点触控事件的本机处理。
我应该每次都检测 [x,y] 位置,将其与操纵杆的位置进行比较,存储上一个位置,比较上一个位置和下一个位置以获得方向?
简而言之,是的,你是。虚拟操纵杆没有内置平台支持;您处理触摸和坐标,并将其转化为应用程序的 UI 隐喻。这几乎就是编程的精髓。
不是“每次”——只有当它发生变化时。Android 是一个事件驱动的系统。
现在,关于您的“我想要它在操作系统级别”的情绪。它在很多层面上都是错误的。首先,操作系统不欠你任何东西。操作系统就是它,接受它或离开它。其次,不愿意付出努力(也就是懒惰)在软件社区中通常是不受欢迎的。第三,操作系统代码仍然是代码。将某些东西移入操作系统可能会提高您的效率,但您为什么认为它会让用户察觉到差异?我们正在谈论的是触摸处理 - 不是特别占用 CPU 的任务。您是否真的构建了一个应用程序、配置文件并发现它的性能不足?在你这样做之前,永远不要猜测瓶颈在哪里。这个词是“过早优化”,这是每个人和他们叔叔的猫都会警告你的东西。