转自:http://www.cnblogs.com/luxiaofeng54/archive/2011/08/14/2138329.html

程序都是调出来的。

下面我介绍下JNI层的log打印方法的使用,类似与Android sdk提供的log

1、Android应用层MainActivity.java

主要功能代码

a)静态载入So库

b)声明本地方法

c)调用本地方法

代码附有注释如下:

public class MainActivity extends Activity {//也就是你mk配置文件中的  LOCAL_MODULE    := NDK_02private static final String libSoName = "NDK_02";private Context mContext = null;private Button btnClick = null;private String mStrMSG = null;private EditText etContext = null;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mContext = this;        etContext = (EditText)findViewById(R.id.et_content);        btnClick = (Button) findViewById(R.id.btn_click);        btnClick.setOnClickListener(new OnClickListener() {                             public void onClick(View v) {                      mStrMSG = setParamToJNI(getContent());                      if(mStrMSG == null) {                             mStrMSG = "调用JNI失败";                      }                      LogUtils.toastMessage(mContext, mStrMSG);               }        });           }       /**     * 获取输入框内容     * @return 输入框内容     */    private String getContent() {    String str = etContext.getText().toString();    return str.trim().length() > 0 ? str:"default value";    }       /**     * 该方法为native方法.     *     *    由C实现     *     * @return     */    public native String  setParamToJNI(String msg);       /**     * 载入JNI生成的so库文件     */    static {        System.loadLibrary(libSoName);    }


2、Android.mk文件的配置

之前有介绍过相关的内容,如果对配置有不清晰的地方请阅读Android.mk文件简介

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_C_INCLUDES := $(LOCAL_PATH)/includeLOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llogLOCAL_MODULE    := NDK_02LOCAL_SRC_FILES := \PrintLog.cinclude $(BUILD_SHARED_LIBRARY)

要打印log必须添加

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

3、JNI层PrintLog.c文件的实现

#include <string.h>#include <android/log.h>#include <jni.h> jstring Java_com_duicky_MainActivity_setParamToJNI(JNIEnv* env, jobject thiz,              jstring msg){        if (msg == NULL) {              //该方法为打印的方法              __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Your params is null");              return (*env)->NewStringUTF(env, "Your params is null");       }        char data[128];       memset(data, 0, sizeof(data));       char *c_msg = NULL;       c_msg = (*env)->GetStringUTFChars(env, msg, 0);       //该方法为打印的方法       __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Get Param:  %s  From Java", c_msg);        return (*env)->NewStringUTF(env, "success");}

i、必须引用头文件#include <android/log.h>

ii、__android_log_print(ANDROID_LOG_INFO, "JNIMsg", " Log Content ");

JNIMsg为你想输出到的过滤标签

Log Content为你想输出的相关信息,用法与C的Printf一样

4、运行程序

输入内容

点击发送

查看控制台打印信息


有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,讲的不够全面的请多多包涵,谢谢,


除此之外,有可能还需配置一下stdout和stderr

使用命令如下:

adb shell stop

adb shell setprop log.redirect-stdio true

adb shell start

这样就重定向了输出


更多相关文章

  1. Android(安卓)6.0(API 23)及其以上动态申请的权限与申请权限的方法
  2. Android存储字符串数据到txt文件
  3. [置顶] cocos2d-x 2.x版本之win32 window移植android 环境搭配
  4. android v4/v7兼容包的源码引用
  5. Android(安卓)私有文件夹 文件的写入与读取
  6. Android中控制SystemUI 中任务栏的的显示与隐藏
  7. Android6.0 SystemUI之网络信号栏显示刷新
  8. Android之FileProvider :通过FileProvider来获取content uri
  9. java.lang.Class Cast Exception: android.widget.HeaderViewLis

随机推荐

  1. android apk 升级代码
  2. 如何在Mac/Linux上设置android环境变量
  3. Android(安卓)进入后台触发的事件,一般用
  4. android app widget,安卓桌面小工具的使
  5. Java 软引用及在Android中的应用
  6. Android之混淆心得与亲身体验
  7. android从web应用读取xml和json数据实战
  8. android 三种Service
  9. android 计算字符串长度,高度
  10. Android:一个两点触控的案例