java jni日志输出_java打印Jni层log
要在java層打印c的log必須引入這個頭文件的宏定義:
#ifndef __LOG#define __LOG#ifdef __cplusplusextern "C"{#endif#include
//宏定義類似java 層的定義,不同級別的Log LOGI, LOGD, LOGW, LOGE, LOGF。 對就Java中的 Log.i log.d
#define LOG_TAG "HelloJni" //這個是自定義的LOG的標識
//#undef LOG//取消默認的LOG
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__)
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__)#ifdef __cplusplus
}#endif
#endif
分析一下:這里調用了系統的log文件 #include
#ifndef _ANDROID_LOG_H#define _ANDROID_LOG_H#include#ifdef __cplusplusextern "C"{#endif
/** Android log priority values, in ascending priority order.*/typedefenumandroid_LogPriority {
ANDROID_LOG_UNKNOWN= 0,
ANDROID_LOG_DEFAULT,/*only for SetMinPriority()*/ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT,/*only for SetMinPriority(); must be last*/} android_LogPriority;/** Send a simple string to the log.*/
int __android_log_write(int prio, const char *tag, const char *text);/** Send a formatted string to the log, used like printf(fmt,...)*/
int __android_log_print(int prio, const char *tag, const char *fmt, ...)#if defined(__GNUC__)#ifdef __USE_MINGW_ANSI_STDIO#if __USE_MINGW_ANSI_STDIO__attribute__ ((format(gnu_printf,3, 4)))#else__attribute__ ((format(printf,3, 4)))#endif
#else__attribute__ ((format(printf,3, 4)))#endif
#endif;/** A variant of __android_log_print() that takes a va_list to list
* additional parameters.*/
int __android_log_vprint(int prio, const char *tag,const char *fmt, va_list ap);/** Log an assertion failure and abort the process to have a chance
* to inspect it if a debugger is attached. This uses the FATAL priority.*/
void __android_log_assert(const char *cond, const char *tag,const char *fmt, ...)#if defined(__GNUC__)__attribute__ ((noreturn))
#ifdef __USE_MINGW_ANSI_STDIO#if __USE_MINGW_ANSI_STDIO__attribute__ ((format(gnu_printf,3, 4)))#else__attribute__ ((format(printf,3, 4)))#endif
#else__attribute__ ((format(printf,3, 4)))#endif
#endif;
#ifdef __cplusplus
}#endif
#endif /* _ANDROID_LOG_H */
View Code
這里面定義了log的優先級,并且log最終調用的都是__android_log_print(...)函數:
int __android_log_print(int prio, const char *tag, const char *fmt, ...)
{
va_list ap;charbuf[LOG_BUF_SIZE];
va_start(ap, fmt);
vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
va_end(ap);return__android_log_write(prio, tag, buf);
}
所以自己定義一個頭文件,并且定義宏指令指向__android_log_print(...)。就可以調用了。
另外在 system/core/include/cutils/log.h 也有定義,但是有些沒有,而且在#include 提示找不到。估計是版本變更了。但是原理是一樣的。
下面是測試函數:
JNIEXPORT jint JNICALL Java_com_example_hellojni_MainActivity_test
(JNIEnv*env, jclass clazz){
LOGD("log.d Java_Log_test()");
LOGI("Log.i Java_Log_test()");return 0;
}
安卓測試程序:
public class MainActivity extendsActivity {static{
System.loadLibrary("HelloJava");
}privateButton btn_getString;privateTextView tv_content;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
setEvent();
}private voidsetEvent() {//TODO Auto-generated method stub
btn_getString.setOnClickListener(newOnClickListener() {
@Overridepublic voidonClick(View v) {//TODO Auto-generated method stub
tv_content.setText(getString());
test();
}
});
}private voidinitUI() {//TODO Auto-generated method stub
btn_getString =(Button) findViewById(R.id.btn_getString);
tv_content=(TextView) findViewById(R.id.tv_content);
}public static nativeString getString();public static native inttest();
}
測試結果:
總結
以上是生活随笔為你收集整理的java jni日志输出_java打印Jni层log的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子游戏跟计算机有什么关联,电脑和电子游
- 下一篇: matlab怎么给函数自变量赋值_MAT