close

昨天我翻译了log.h文件,介绍了如何使用NDK API写系统日志,今天我写个示例程序,示范下如何使用这个API。
这个程序使用eclipse创建一个java程序,通过jni调用我们的共享库,这个共享库非常简单,只实现一个写日志的函数,ok,我们开始。
首先,我们还是先建立一个Android工程,打开Eclipse开发环境,新建工程,Build Target设为Android 1.5, 其他项目随便填。为了方便,可以把这个项目放在ndk的apps目录下面。
其次,我们新建一个调用共享库的类,名字就叫MyLog好了,给他添加一个静态区块,以实现加载共享库的目的。如下所示:
static
{
  try
  {
   System.loadLibrary("TestLog");
  }
  catch (UnsatisfiedLinkError e)
  {
   System.err.println("Cannot load hello library:\n " + e.toString());
  }
}
然后,再添加一个native方法:
public native int Log();
然后编译,使用javah生成一个jni样式头文件,如下所示,
javah -jni -d D:\eclipse\workspace\TestLog\bin -classpath D:\eclipse\workspace\TestLog\bin testLog.myLog.MyLog
请将上面的D:\eclipse\workspace\TestLog\bin换成你的类文件路径, 注意,这里要使用全限定类型名称。
我们在主界面上添加一个按钮,在主Activity类的onCreate方法里面,为这个按钮添加一个事件接口,如下所示,
Button btnLog = (Button) findViewById(R.id.btnLog);
btnLog.setOnClickListener(new OnClickListener()
{
   @Override
   public void onClick(View v)
   {     
      MyLog log = new MyLog();
      log.Log();  
   }      
});
在项目目录下面添加一个Application.mk文件,文件内容很简单,只有两句话,
APP_PROJECT_PATH := $(call my-dir)
APP_MODULES      := TestLog
这样,我们的java工程就做好了,接下来我们再来写native c的共享库,在ndk/sources目录下新建一个子目录,名字就叫TestLog好了,
把刚才生成的jni头文件拷贝到这里,然后新建一个.c文件,这个文件只有一个函数,如下所示:
#include
#include "testLog_myLog_MyLog.h"
JNIEXPORT jint JNICALL Java_testLog_myLog_MyLog_Log(JNIEnv * penv, jobject obj)
{
   static int iCount = 0;
   iCount++;
   __android_log_print(ANDROID_LOG_INFO, "wuzhenhua", "hello, this is my number %d log message!", iCount);
   return 0;
}
注意,函数声明必须要跟生成的jni头文件保持一致,否则java会找不到要调用的函数,导致异常发生!
这个函数内部调用了 __android_log_print这个API函数,向系统输出日志,第一个参数指定日志类型级别,声明为android_LogPriority枚举类型,如下所示:
typedef enum android_LogPriority {
    ANDROID_LOG_UNKNOWN = 0,
    ANDROID_LOG_DEFAULT,   
    ANDROID_LOG_VERBOSE,
    ANDROID_LOG_DEBUG,
    ANDROID_LOG_INFO,
    ANDROID_LOG_WARN,
    ANDROID_LOG_ERROR,
    ANDROID_LOG_FATAL,
    ANDROID_LOG_SILENT,  
} android_LogPriority;
第二参数,是一个标签,名字随便取,只是起到一个分类和过滤的作用。
第三个参数,就是具体的消息文本了,注意,这个函数取不定长度参数,让你可以象用printf函数那样使用,也就是这个参数可以加上类似%d,%x等格式化字串,在这个参数后面再加上相应类型的参数即可。
好,主函数写完了,我们再来写一个Android.mk文件,以下是文件内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := TestLog
LOCAL_SRC_FILES := TestLog.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
ok,就差最后一步,我们来编译一下,进入到ndk主目录,输入命令:
make APP=TestLog
大功告成!生成的共享库会自动拷贝到  你的项目路径/libs/armeabi目录下面。
总结:目前,ndk的调试并不方便,如果能把程序中可能出错的地方,以日志的方式输出来,查看出错时的环境和本地变量的值,对我们查找出错原因会大有帮助。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 angledark0123 的頭像
    angledark0123

    CONY的世界

    angledark0123 發表在 痞客邦 留言(0) 人氣()