ubicacion - ¿Es posible crear elementos de IU con el NDK?-falta de especificaciones en los documentos de Android
ndk version 11c (1)
Seguro que puede. Lea sobre llamar a Java desde C (++) y llame a las respectivas funciones de Java: construya los elementos de la IU (diseños, botones, etc.) uno por uno o cargue un diseño XML. No hay una interfaz específica para C para eso, pero el de Java está ahí para llamar.
A menos que sea un juego y tengas la intención de hacer tu propio dibujo a través de OpenGL ES. No estoy seguro si puedes mezclar y combinar.
En NativeActivity
, aún puede obtener un puntero al objeto de Actividad de Java y llamar a sus métodos: es el miembro clazz
de la estructura ANativeActivity
que se pasa a su android_main
como parámetro, a través de la estructura android_app
. Tome ese puntero, tome el JNIEnv*
de la misma y asigne un diseño.
¿Cómo esto interoperará con el dibujo de OpenGL? No estoy seguro.
EDITAR: acerca de armar su propio procesamiento de entrada. La devolución de llamada de la clave es onInputEvent(struct android_app* app, AInputEvent* event)
dentro de la estructura android_app
. Coloque su devolución de llamada allí, Android lo llamará cuando sea apropiado. Use AInputEvent_getType(event)
para recuperar el tipo de evento; los eventos táctiles tienen el tipo AINPUT_EVENT_TYPE_MOTION.
EDIT2: aquí hay una aplicación nativa mínima que capta los eventos táctiles:
#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;
}
}
}
Necesitas, naturalmente, agregar un proyecto alrededor, con un manifiesto, Android.mk y todo. Android.mk necesitará lo siguiente como última línea:
$(call import-module,android/native_app_glue)
El native_app_glue
es una biblioteca estática que proporciona algunos puentes en C para las API que normalmente se consumen a través de Java.
Puedes hacerlo sin una biblioteca de pegamento también. Pero luego deberá proporcionar su propia función ANativeActivity_onCreate
, y un montón de otras devoluciones de llamada. El combo android_main
/ android_app
es una interfaz definida por la biblioteca de pegamento.
EDITAR: para coordenadas táctiles, use AMotionEvent_getX/Y()
, pasando el objeto de evento como el primer parámetro e índice del puntero como el segundo. Use AMotionEvent_getPointerCount()
para recuperar el número de punteros (puntos de contacto). Ese es su procesamiento nativo de eventos multitáctiles.
Se supone que debo detectar la posición [x, y] cada vez, compararla con la ubicación de mi joystick, almacenar la posición anterior, comparar la posición anterior y la siguiente para obtener la dirección?
En resumen, sí, lo eres. No hay soporte de plataforma incorporado para joysticks virtuales; manejas los toques y las coordenadas, y los traduces a la metáfora de la interfaz de usuario de tu aplicación. Esa es casi la esencia de la programación.
No "todo el tiempo" sin embargo, solo cuando está cambiando. Android es un sistema orientado a eventos.
Ahora, sobre su sentimiento de "lo quiero en el nivel del sistema operativo". Es INCORRECTO en muchos niveles. Primero, el SO no te debe nada. El sistema operativo es lo que es, tómalo o déjalo. En segundo lugar, la falta de voluntad para extender un esfuerzo (AKA es flojo) generalmente es mal visto en la comunidad de software. En tercer lugar, el código del sistema operativo sigue siendo código. Mover algo al sistema operativo puede hacerte ganar algo de eficiencia, pero ¿por qué crees que hará una diferencia perceptible para el usuario? Se trata de un procesamiento táctil, no una tarea particularmente intensiva de CPU. ¿De hecho construiste una aplicación, perfil y encuentras que falta su rendimiento? Hasta que lo haga, nunca adivine dónde estaría el cuello de botella. La palabra para eso es "optimización prematura", y es algo que todos y el gato de su tío te advertirían.
Después de leer los documentos relacionados, no entiendo si puedo crear elementos como botones u otros elementos de la interfaz de usuario utilizados para obtener las entradas del usuario con solo el uso del código C ++ / C compilado con el NDK.
No hay problemas cuando quiero manejar una "ventana" o actividad que necesita permanecer enfocada, pero no entiendo cómo construir una interfaz de usuario con elementos para las devoluciones de llamada y la entrada del usuario.
Es extraño que haya un marco de ventanas en su lugar, pero sin ningún rastro de devoluciones de llamadas para los elementos de la interfaz de usuario.
¿Puedo crear botones táctiles o un gamepad virtual con el NDK?
Aprecio el esfuerzo y el hecho de que nos estamos acercando a mi punto, pero aparentemente no me estaba explicando lo suficiente.
Encontré esta imagen aquí
Ahora mi problema y el enfoque de esta pregunta es:
Supongamos que puedo colocar y dibujar este joystick virtual, ¿cómo puedo detectar solo los movimientos y tener una devolución de llamada como Joystick.onUp
o Joystick.onDown
con Android y usar solo el NDK?
Si no hay devoluciones de llamada de este tipo disponibles desde el NDK, se supone que debo detectar la posición [x, y] cada vez, compararla con la ubicación de mi joystick, almacenar la posición anterior, comparar la posición anterior y la siguiente para obtener la dirección?
Dado que el sensor arroja eventos a un ritmo realmente rápido, creo que construir esto solo teniendo en cuenta solo los pares X, Y sin procesar, terminará teniendo un sistema de control realmente ineficiente porque no se optimizará a nivel del sistema operativo con el apropiado llamadas de sensor
De acuerdo con el ejemplo NativeActivity, tampoco está claro cómo manejar múltiples puntos de contacto, por ejemplo, ¿cómo puedo manejar 2 eventos táctiles al mismo tiempo?
Simplemente considere la imagen de arriba y piense en tener solo coordenadas x, y para 1 punto de contacto y cómo puedo resolver esto de una manera eficiente que sea compatible con el NDK.
Gracias.