不知道為什麼雖然研究生沒有寒假,
但似乎還是去了很多地方,
2013年1月31日 星期四
2013年1月26日 星期六
Ways to debug Jni in C
android priority:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent
D Debug
I Info
W Warn
E Error
F Fatal
S Silent
第二個欄位是tag,例如Dalvikm,qmenud,BatteryService,也可自訂,主要是用來辨認是何種訊息。括號內的是pid,後面就是訊息內容了。這大概是log的格式。
In JAVA
在JAVA中,logcat的class是在android.util.log裡,因此若要使用,需要在header加上import android.util.Log。程式的使用如下:
Log.v(): VERBOSE
Log.d(): DEBUG
Log.i() : INFO
Log.w(): WARN
Log.e(): ERROR
Log.d(): DEBUG
Log.i() : INFO
Log.w(): WARN
Log.e(): ERROR
In JNI
在JNI中,可以使用<android/log.h>所定義的macro:
int __android_log_print(int prio, const char *tag, const char *fmt, ...)
#if defined(__GNUC__)
__attribute__ ((format(printf, 3, 4)))
#endif
;
#if defined(__GNUC__)
__attribute__ ((format(printf, 3, 4)))
#endif
;
參考android討論區所提到的這篇文章,可定義如下的macro以方便使用:
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "libnav",__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "libnav",__VA_ARGS__)
就可以在.c檔裡輸出到logcat,方法如下:
jint
Java_com_latrell_libtest_libtest_add( JNIEnv* env, jobject thiz, jint x, jint y)
{
LOGD("#############test log in JNI, x is %d, y is %d\n",x,y);
return add(x,y);
}
Java_com_latrell_libtest_libtest_add( JNIEnv* env, jobject thiz, jint x, jint y)
{
LOGD("#############test log in JNI, x is %d, y is %d\n",x,y);
return add(x,y);
}
從logcat就可看到,也是一種debug方式:
D/libnav ( 716): #############test log in JNI, x is 3, y is 5
在JNI裡使用logcat,要在Android.mk裡將liblog link進來,因此要加上:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
將ndk裡的hello-jni改寫了一下,程式碼如下:
hello-jni.c
#include <stdio.h>
#include <jni.h>
#include <android/log.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "libnav",__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "libnav",__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "libnav",__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "libnav",__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "libnav",__VA_ARGS__)
int add(int x, int y)
{
return x+y;
}
jint
Java_com_latrell_libtest_libtest_add( JNIEnv* env, jobject thiz, jint x, jint y)
{
LOGD("#############test log in JNI, x is %d, y is %d\n",x,y);
return add(x,y);
}
#include <jni.h>
#include <android/log.h>
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, "libnav",__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "libnav",__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , "libnav",__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , "libnav",__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , "libnav",__VA_ARGS__)
int add(int x, int y)
{
return x+y;
}
jint
Java_com_latrell_libtest_libtest_add( JNIEnv* env, jobject thiz, jint x, jint y)
{
LOGD("#############test log in JNI, x is %d, y is %d\n",x,y);
return add(x,y);
}
Android.mk:
LOCAL_PATH := $(call my-dir)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(CLEAR_VARS)
LOCAL_MODULE := latrell-libtest
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
include $(CLEAR_VARS)
LOCAL_MODULE := latrell-libtest
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)
libtest.java:
package com.latrell.libtest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class libtest extends Activity {
/** Called when the activity is first created. */
int ret=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
int a=3;
int b=5;
ret=add(a,b);
tv.setText(Integer.toString(ret));
Log.i("Create Android", "################Test in java");
setContentView(tv);
}
public native int add(int x, int y);
static {
System.loadLibrary("latrell-libtest");
}
}
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class libtest extends Activity {
/** Called when the activity is first created. */
int ret=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
int a=3;
int b=5;
ret=add(a,b);
tv.setText(Integer.toString(ret));
Log.i("Create Android", "################Test in java");
setContentView(tv);
}
public native int add(int x, int y);
static {
System.loadLibrary("latrell-libtest");
}
}
Reference Link : http://kezeodsnx.pixnet.net/blog/trackback/3f2cd3ee78/26517648
2013年1月9日 星期三
喜怒哀樂
為什麼我不能在憤怒的時候放聲大叫
為什麼我不能在難過的時候放聲大哭
為什麼我不能在開心的時候放聲大笑
什麼時候才可以讓自己更像自己一點
什麼時候我不再像以前一樣 遇到問題就可以放肆的問
什麼時候我變成一個操俗辣
遇到想講的事情都不敢講
不敢去要
不敢去追求
這就是我要的嗎?
那......我之前相信的一切
又算什麼
2013年1月7日 星期一
訂閱:
文章 (Atom)
.jpg)