zoukankan      html  css  js  c++  java
  • Android JNI和NDK学习(04)--NDK调试方法(转)

    本文转自:http://www.cnblogs.com/skywang12345/archive/2013/05/23/3092812.html

    本文主要介绍在ndk中添加log的方法。然后,我们就可以通过log去调试ndk。

    1 添加ndk对log支持

    若需要添加ndk对log的支持,只需要通过以下2步即可实现。

    1.1 修改Android.mk

    如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:

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

    如生成的库文件是“.a文件”,则在Android.mk中添加如下内容:

    LOCAL_LDLIBS:=-llog

    1.2 在.c或.cpp文件中引用log头文件

    添加如下内容:

    // 引入log头文件
    #include <android/log.h>  
      
    // log标签
    #define  TAG    "hello_load"
    // 定义info信息
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
    // 定义debug信息
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
    // 定义error信息
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)

    完成上面2步之后,我们就可以在.c/cpp文件中添加LOGI、LOGD、LOGE去打印信息!使用LOGI、LOGD、LOGE的方法和使用printf一样,如LOGD("%s ", __func__); 作用是输出函数名。

    2 ndk中log实例

    下面通过实例增加log信息的方法。在“Android JNI和NDK学习(03)--动态方式实现JNI”的基础上添加log信息。

    (01) 修改ndk_load.c

    修改后的ndk_load.c的内容如下(红色部分为 “与log相关的内容):

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <jni.h>
    #include <assert.h>
    
    
    // 获取数组的大小
    # define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
    // 指定要注册的类,对应完整的java类名
    #define JNIREG_CLASS "com/skywang/ndk/NdkLoad"
    
    
    // 引入log头文件
    #include <android/log.h>  
    
    // log标签
    #define  TAG    "hello_load"
    // 定义info信息
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__)
    // 定义debug信息
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
    // 定义error信息
    #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__)
    
    // 返回字符串"hello load jni"
    JNIEXPORT jstring JNICALL native_hello(JNIEnv *env, jclass clazz)
    {
        LOGI("%s info
    ", __func__);
        LOGD("%s debug
    ", __func__);
        LOGE("%s error
    ", __func__);
        return (*env)->NewStringUTF(env, "hello load jni.");
    }
    
    // Java和JNI函数的绑定表
    static JNINativeMethod method_table[] = {
        { "HelloLoad", "()Ljava/lang/String;", (void*)native_hello },//绑定
    };
    
    // 注册native方法到java中
    static int registerNativeMethods(JNIEnv* env, const char* className,
            JNINativeMethod* gMethods, int numMethods)
    {
        jclass clazz;
        clazz = (*env)->FindClass(env, className);
        if (clazz == NULL) {
            return JNI_FALSE;
        }
        if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {
            return JNI_FALSE;
        }
    
        return JNI_TRUE;
    }
    
    int register_ndk_load(JNIEnv *env)
    {
        // 调用注册方法
        return registerNativeMethods(env, JNIREG_CLASS,
                method_table, NELEM(method_table));
    }
    
    JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv* env = NULL;
        jint result = -1; 
    
        if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
            return result;
        }   
    
        register_ndk_load(env);
    
        // 返回jni的版本
        return JNI_VERSION_1_4;
    }

    (02) 修改Android.mk

    修改后的Android.mk内容如下(红色部分为 “与log相关的内容):

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    
    LOCAL_MODULE    := ndk_load
    LOCAL_SRC_FILES := ndk_load.c
    # 添加对log库的支持
    LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog
    #  注:若生成static的.a,只需添加 LOCAL_LDLIBS:=-llog 
    
    include $(BUILD_SHARED_LIBRARY)
    
    LOCAL_PATH := $(call my-dir)

    (03) 重新生成.so文件,然后执行。

    执行时,通过查看logcat信息,即可发现新增的log信息。如下图:

  • 相关阅读:
    php之工厂模式
    PHP 给GIF 缩略图实例代码
    WGS84 Mercator project转换的算法(C#)
    .net Enum用法
    Google Maps API编程资源大全
    结对作业
    使用Lightbox制作照片条
    使用css3中transition的页面切换
    使用css3中transition的页面切换(继续创新版)
    iframe中父窗口获取子窗口的元素
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/7068605.html
Copyright © 2011-2022 走看看