JNI 中打印变量

1.封装个log.h

#ifndef __MULTI_TRACE_H__

#define __MULTI_TRACE_H__

#ifdef ANDROID_NDK_BUILD

#define LOG_TAG "NATIVE NDK INFO"

#include <android/log.h> // only use in NDK

#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))

#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__))

#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__))

#elif defined ANDROID_SOURCE_BUILD

#define LOG_TAG "NATIVE SRC INFO"

extern "C" {

#include <cutils/log.h> // only use in ANDROID SOURCE

}

#define LOGE(...) LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)

#define LOGD(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#define LOGI(...) LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)

#define LOGW(...) LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)

#elif defined IOS_PLATFORM_BUILD

#define LOGE printf

#define LOGD printf

#define LOGI printf

#define LOGW printf

#elif defined WP_PLATFORM_BUILD

#define LOG_TAG "NATIVE WINDOWS PHONE"

#define LOG_ERROR "ERROR"

#define LOG_DEBUG "DEBUG"

#define LOG_INFOR "INFOR"

#define LOG_WARN "WARN"

void LOG(const char* status, const char* tag, const char* format, ...);

#define LOGE(...) LOG(LOG_ERROR, LOG_TAG, __VA_ARGS__)

#define LOGD(...) LOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__)

#define LOGI(...) LOG(LOG_INFO, LOG_TAG, __VA_ARGS__)

#define LOGW(...) LOG(LOG_WARN, LOG_TAG, __VA_ARGS__)

#else

#define LOGE printf

#define LOGD printf

#define LOGI printf

#define LOGW printf

#endif

#endif

2.在 Android.mk 中配置

LOCAL_PATH := $(call my-dir)    // 设置为当前目录

include $(CLEAR_VARS)    // 清空变量

LOCAL_MODULE    := ApkPatchLibrary  // 最终生成的 .so 文件 会是次名钱夹 lib (如这个名为 libxxx, 生成的.so文件包名就是此名)

LOCAL_CFLAGS =  -DANDROID_NDK_BUILD -D__STDC_FORMAT_MACROS -D__STDC_INT64__     // 设置这句相当于每个c/c++文件中声明了 xxxxx(-Dxxxxx)

LOCAL_CXXFLAGS :=

LOCAL_C_INCLUDES := $(LOCAL_PATH)

LOCAL_SRC_FILES := com_lib_utils_Patch.c   // 编译的c/c++文件

LOCAL_LDLIBS := -lz -llog  // 需要加上 这个日志才会打印出来,-l 是固定声明,(如:-lz标示加载系统 z.so包, -llog标示加载系统 log.so包)

include $(BUILD_SHARED_LIBRARY)   // 设置声明 动态库

3.打印日志,请看例子:

JNIEXPORT jint JNICALL Java_com_lib_utils_PatchUtils_patch(JNIEnv *env,

jobject obj, jstring old, jstring new, jstring patch) {

char * ch[4];

ch[0] = "bspatch";

ch[1] = (char*) ((*env)->GetStringUTFChars(env, old, 0));

ch[2] = (char*) ((*env)->GetStringUTFChars(env, new, 0));

ch[3] = (char*) ((*env)->GetStringUTFChars(env, patch, 0));

LOGD("11111111111111111111");

const char *str = (*env)->GetStringUTFChars(env, old, 0);

const char *strnew = (*env)->GetStringUTFChars(env, new, 0);

const char *strpatch = (*env)->GetStringUTFChars(env, patch, 0);

LOGD("The first is %s", str);

LOGD("The second is %s", strnew);

LOGD("The third  is %s", strpatch);

LOGD("11111111111111111111");

int ret = applypatch(4, ch);

(*env)->ReleaseStringUTFChars(env, old, ch[1]);

(*env)->ReleaseStringUTFChars(env, new, ch[2]);

(*env)->ReleaseStringUTFChars(env, patch, ch[3]);

return ret;

}

这样就可以打印出 old, new,patch 这三个参数(变量)的值了。

时间: 2024-10-09 02:21:07

JNI 中打印变量的相关文章

JNI中打印log

想要实现打印log最简单的方法: 在.c中包含android/log.h 自定义一个宏来代替log.h中的长段宏: 然后注意要在Android.mk中添加这么一句到: 这样就可以使用像C的printf那样打印一般的log了:

Android jni 中打印logcat日志

1.在android.mk文件中 在include $(CLEAR_VARS)下面一行添加: LOCAL_LDLIBS := -llog 2.在c文件中添加头文件 #include<android/log.h> 和自定义方法 #define TAG "test" // 这个是自定义的LOG的标识#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型#defin

关于在for循环中绑定事件打印变量i是最后一次。

其实函数引用的外部变量都是最后一次的值. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #box{ width:100px; height:100px; background-color:pink; } </style> <

Java 中的 int 与 Integer 用于 List&lt;Integer&gt; 时,以及通过打印变量检测程序运行和函数调用次数计数

总结一下最近做的东西中遇到的问题 1. Java 中的 int 与 Integer 用于 List<Integer>  时 两者之间的关系都是很清楚的,int 是基本数据类型,存储的是值,而 Integer 是引用数据类型,存储的是指向数值的地址. Integer 是在类层面上对 int 的封装.然后 Java 提供了自动装包拆包机制,使得两者之间可以转换.这里主要是测试了下它们用于 List 时候的疑惑. /* * To change this template, choose Tools

windows环境变量如何在cmd中打印

在windows的cmd下,用"set"命令可以得到全部的环境变量,如何想得到某个环境变量,直接这样"set path"就可以了. set不仅如何,还有其他功能,有机会再补充上来. windows环境变量如何在cmd中打印

JNI的native代码中打印日志到eclipse的logcat中

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

Java中静态变量与静态方法的继承

class A { static int a = 1; static int b = 2; public static void printA() { System.out.println(a); } public static void printB() { System.out.println(b); } } class B extends A { static int a = 3; static int b = 4; public static void printB() { // 如果B

1.Linux Shell中的变量

1. Shell变量类型 Shell是一种动态类型语言(不使用显式的数据声明)和弱类型语言(变量的类型操作根据需求而不同).Shell中的变量是不分类型的(都是字符串类型),但是依赖于具体的上下文,Shell编程也允许比较操作和整数操作. 2. Shell变量的分类 Shell中有3种变量:用户变量.位置变量(Processing Parameter).环境变量. 1.用户变量:用户在Shell编程过程中定义的变量,分为全局变量和局部变量.默认情况下,用户定义的Shell变量为全局变量,如果要指

shell中的变量及shell条件判断

Shell 基础之变量和条件判断 一.shell概述 1.shell概述: shell是一个命令行的解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统及程序,用户可以用shell来启动.挂起.停止甚至编写一些程序,shell还是一个功能强大的编程语言,shell是解释性的脚本语言,在shell中可以直接调用Linux命令. 2.shell脚本的用途 (1)自动化常用的命令 (2)执行系统管理和故障排除 (3)执行简单的应用程序 (4)处理文本或文件 3.shell的分类 (1