日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java jni日志输出_java打印Jni层log

發布時間:2025/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。