在android jni中使用log

来源:互联网 发布:官方数据透露大秘密 编辑:程序博客网 时间:2024/05/18 02:43

开发环境:

ubuntu 10.10 + eclipse + adt +android ndk +  android sdk

 

1、新建简单项目:JNIDemo,

设计jni到java类:

 

Java代码  收藏代码
  1. package com.lt.jni  
Java代码  收藏代码
  1. public class JNI {  
  2.     /** 
  3.      * call the native printf method to print 
  4.      */  
  5.     public native void print();  
  6.       
  7.     public native String sayHello();  
  8. }  
 

2、在android到bin目录下,执行命令:

javah -jni com.lt.jni.JNI 来生成头文件:com_lt_jni_JNI.h

 

C代码  收藏代码
  1. /* DO NOT EDIT THIS FILE - it is machine generated */  
  2. #include <jni.h>  
  3. /* Header for class com_lt_jni_JNI */  
  4.   
  5. #ifndef _Included_com_lt_jni_JNI  
  6. #define _Included_com_lt_jni_JNI  
  7. #ifdef __cplusplus  
  8. extern "C" {  
  9. #endif  
  10. /* 
  11.  * Class:     com_lt_jni_JNI 
  12.  * Method:    print 
  13.  * Signature: ()V 
  14.  */  
  15. JNIEXPORT void JNICALL Java_com_lt_jni_JNI_print  
  16.   (JNIEnv *, jobject);  
  17.   
  18. /* 
  19.  * Class:     com_lt_jni_JNI 
  20.  * Method:    sayHello 
  21.  * Signature: ()Ljava/lang/String; 
  22.  */  
  23. JNIEXPORT jstring JNICALL Java_com_lt_jni_JNI_sayHello  
  24.   (JNIEnv *, jobject);  
  25.   
  26. #ifdef __cplusplus  
  27. }  
  28. #endif  
  29. #endif  

 

3、在项目目录下,新建jni目录,并新建c源文件com_lt_jni_JNI.c:

C代码  收藏代码
  1. #include <jni.h>  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <android/log.h>  
  5. #include "com_lt_jni_JNI.h"  
  6.   
  7. /* 
  8.  * Class:     com_lt_jni_JNI 
  9.  * Method:    print 
  10.  * Signature: ()V 
  11.  */  
  12. JNIEXPORT void JNICALL Java_com_lt_jni_JNI_print  
  13.   (JNIEnv *env, jobject obj)  
  14. {  
  15.     __android_log_print(ANDROID_LOG_INFO,"JNI","Java_com_lt_jni_JNI_print");  
  16.     printf("Hello world!\n");  
  17.     return ;  
  18. }  
  19.   
  20.   
  21. JNIEXPORT jstring JNICALL Java_com_lt_jni_JNI_sayHello  
  22.   (JNIEnv *env, jobject obj)  
  23. {  
  24.     __android_log_print(ANDROID_LOG_INFO,"JNI","Java_com_lt_jni_JNI_sayHello");  
  25.     return (*env)->NewStringUTF(env,"Hello JNI");  
  26. }   

 

关键代码:#include <android/log.h>

__android_log_print(ANDROID_LOG_INFO,"TAG","log info");

 

4、在jni目录下新建Android.mk文件:

 

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

 

LOCAL_SRC_FILES:=\

com_lt_jni_JNI.c

 

LOCAL_CFLAGS := -O2 -g

#LOCAL_CFLAGS += -D__FAVOR_BSD

 

 

#LOCAL_C_INCLUDES += \

# bionic/libc/include\

# external/libpcap

LOCAL_C_INCLUDES := \

    $(JNI_H_INCLUDE)

 

#LOCAL_STATIC_LIBRARIES += libpcap

 

#LOCAL_SHARED_LIBRARIES += libssl libcrypto

 

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

 

LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)

 

#LOCAL_MODULE_TAGS := eng

 

LOCAL_MODULE := helloworld

 

include $(BUILD_SHARED_LIBRARY)


其中关键代码:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
因为在程序中使用来log模块,所以需要指定到依赖库log

5、在console中进行到项目目录执行命令进行构建:
cd $HOME/workspace/JNIDemo
$NDK/ndk-build
-----------------------------------------------------------------------------------------------
lql@ubuntu:~/workspace/JNIDemo$ $NDK/ndk-build 
Compile thumb  : helloworld <= com_lt_jni_JNI.c
SharedLibrary  : libhelloworld.so
Install        : libhelloworld.so => libs/armeabi/libhelloworld.so

6、将手机和电脑连接,然后运行项目,在logcat中观察是否有日志信息输出:
09-14 17:28:32.067: INFO/JNI(6821): Java_com_lt_jni_JNI_print
09-14 17:28:32.067: INFO/JNI(6821): Java_com_lt_jni_JNI_sayHello

备注:
在使用$NDK/ndk-build进行构建到时候,如果之前构建过多次,那么最后先执行$NDK/ndk-build clean来进行清理
因为,有时,如果共享库文件已经生成,那么再次构建到时候,默认貌似不覆盖,这样导致虽然改来代码,却看不到效果,
之前还因为这个耽误来不少时间,特意记下,希望给路过到朋友一点帮助!
原创粉丝点击