Me gustaría depurar una aplicación JNI C insertando mensajes de registro en logcat. ¿Cuál es la API C que hace esto?¿Qué es la API de registro para llamar desde un programa Android JNI?
Respuesta
De esta manera:
#include <android/log.h>
__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error here");//Or ANDROID_LOG_INFO, ...
añadirlo a su makefile como esto:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
A continuación se presenta el fragmento de código que se debe incluir en su código nativo.
#include <android/log.h>
__android_log_write(ANDROID_LOG_ERROR, "Tag", "Error msg");//Or ANDROID_LOG_INFO, ...
Para utilizar la API anterior, necesitamos vincular la biblioteca correspondiente.
Podemos vincular una biblioteca compartida en Android de 3 maneras. En menos de 3 casos, las líneas mencionadas deben agregarse en Android.mk
Aquí están las tres formas.
1. LOCAL_LDLIBS way
LOCAL_LDLIBS := -llog
Por alguna razón, si 1 no funciona (no funcionó para mí), se puede tratar por debajo de 2 maneras
2. LOCAL_LDFLAGS way
LOCAL_LDFLAGS := -llog
3. LOCAL_SHARED_LIBRARIES way
LOCAL_SHARED_LIBRARIES += liblog
syslog
Esta función POSIX da salida también a LogCat .
Tiene la ventaja de ser más portátil en sistemas que no sean Android que y agrega automáticamente el paquete de la aplicación al registro.
Probado con esta aplicación de ejemplo: https://github.com/cirosantilli/android-cheat/tree/a080f5c370c1f06e74a8300fb4a2e93369861047/gradle/NdkSyslog la fuente NDK es:
#include <jni.h>
#include <string>
#include <syslog.h>
extern "C"
JNIEXPORT jstring JNICALL
Java_com_cirosantilli_android_1cheat_ndksyslog_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
syslog(LOG_CRIT, "hello syslog");
return env->NewStringUTF("Check adb logcat");
}
Y Logcat ahora contiene:
01-14 15:39:07.582 3633 3633 E com.cirosantilli.android_cheat.ndksyslog: hello syslog
probado en Android O, hikey 960.
- 1. Android para llamar desde un número virtual
- 2. Llamar a un programa externo desde OCaml
- 3. Llamar a python desde un programa C++ para su distribución
- 4. google maps api para la página de registro de Android
- 5. Jni Tutorial para Android
- 6. ¿Qué podría causar SIGSEGV al llamar a NewObjectArray para JNI en Android?
- 7. ¿Qué es 'Referencia global JNI'
- 8. ¿Cuál es la mejor manera de implementar una API REST de registro para iPhone/Android?
- 9. FFMpeg jni en Android?
- 10. ¿Qué es JNI Graphics o cómo usarlo?
- 11. Llamar LLVM Jit desde el programa c
- 12. JNI se bloquea al llamar a CallVoidMethod
- 13. Llamar a un archivo DLL desde un applet a través de JNI
- 14. Firefox api - acceso desde mi programa
- 15. ¿Hay alguna manera de ocultar la consola de inicio win32 desde un programa Java (si es posible sin JNI)?
- 16. JNI Invocation API - NoClassDefFoundError (C/Java)
- 17. Mi codificador JNI JPEG para Android es realmente lento
- 18. ¿Cómo puedo llamar a notepad.exe desde un programa C?
- 19. API de registro para AS3
- 20. Llamar a comandos SVN desde un programa java
- 21. Cómo llamar a la API de Magento desde VB.NET
- 22. ¿Qué significa llamar a bitmap.recycle() en la API 11+?
- 23. Llamar ASP.NET Web API desde código subyacente
- 24. Administración de memoria JNI usando la API de invocación
- 25. 2D API o OpenGL ES para un juego Android 2D?
- 26. ¿Qué versión de API para Android 2.3.6?
- 27. Llamar a la función Java desde JavaScript sobre Android WebView
- 28. Llamar a cualquier método Java desde C#
- 29. Fuerza Java para llamar a mi C++ destructor (JNI)
- 30. Llamar línea de comando desde el programa C
"-L $ (SYSROOT)/usr/lib "no es necesario, solo" LOCAL_LDLIBS: = -llog "funcionará de la misma manera. Para aquellos que no funciona de todos modos (como yo)) - Tenía la línea "include $ (CLEAR_VARS)" en mi Android.mk _after_ "LOCAL_LDLIBS: = -llog", la moví _antes_, y ahora funciona bien. – Mixaz
Por si acaso, si esto no funciona, consulte la solución a continuación. –
o __android_log_print (ANDROID_LOG_INFO, "Etiqueta", "i% c funciona lik% x print% x", "t", 14, 15); –