当前位置: 代码迷 >> Android >> 在android jni中运用log
  详细解决方案

在android jni中运用log

热度:97   发布时间:2016-05-01 15:20:38.0
在android jni中使用log

开发环境:

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

?

1、新建简单项目:JNIDemo,

设计jni到java类:

?

package com.lt.jni
public class JNI {	/**	 * call the native printf method to print	 */	public native void print();		public native String sayHello();}
?

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

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

?

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_lt_jni_JNI */#ifndef _Included_com_lt_jni_JNI#define _Included_com_lt_jni_JNI#ifdef __cplusplusextern "C" {#endif/* * Class:     com_lt_jni_JNI * Method:    print * Signature: ()V */JNIEXPORT void JNICALL Java_com_lt_jni_JNI_print  (JNIEnv *, jobject);/* * Class:     com_lt_jni_JNI * Method:    sayHello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_lt_jni_JNI_sayHello  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

?

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

#include <jni.h>#include <stdio.h>#include <string.h>#include <android/log.h>#include "com_lt_jni_JNI.h"/* * Class:     com_lt_jni_JNI * Method:    print * Signature: ()V */JNIEXPORT void JNICALL Java_com_lt_jni_JNI_print  (JNIEnv *env, jobject obj){	__android_log_print(ANDROID_LOG_INFO,"JNI","Java_com_lt_jni_JNI_print");	printf("Hello world!\n");	return ;}JNIEXPORT jstring JNICALL Java_com_lt_jni_JNI_sayHello  (JNIEnv *env, jobject obj){	__android_log_print(ANDROID_LOG_INFO,"JNI","Java_com_lt_jni_JNI_sayHello");	return (*env)->NewStringUTF(env,"Hello JNI");}?

?

关键代码:#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
-----------------------------------------------------------
[email protected]:~/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来进行清理
因为,有时,如果共享库文件已经生成,那么再次构建到时候,默认貌似不覆盖,这样导致虽然改来代码,却看不到效果,
之前还因为这个耽误来不少时间,特意记下,希望给路过到朋友一点帮助!





?

  相关解决方案