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 这三个参数(变量)的值该。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

JNI 可变印刷的更多相关文章

  1. 【转】 Android 开发 之 JNI入门 - NDK从入门到精通

    原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub  ...

  2. 【转】JNI学习积累之一 ---- 常用函数大全

    原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...

  3. C语言可变参数在宏定义中的应用

    在C语言的标准库中,printf.scanf.sscanf.sprintf.sscanf这些标准库的输入输出函数,参数都是可变的.在调试程序时,我们可能希望定义一个参数可变的输出函数来记录日志,那么用 ...

  4. 设置UILabel可变高度(根据文本内容自动适应高度)

    @property(nonatomic)UILabel *showLabel;   // 计算文本所占高度,计算出来之后设置label的高度 // 第一个参数:字体大小,字体大小/样式影响计算字体的高 ...

  5. C在宏定义中使用的语言可变参数

    于C标准库的语言,printf.scanf.sscanf.sprintf.sscanf入输出函数,參数都是可变的.在调试程序时.我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一 ...

  6. 【Android 应用开发】Android 开发 之 JNI入门 - NDK从入门到精通

    NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git -- Java传递参数给C ...

  7. JNI编程实现(Linux)

    JNI是Java Native Interface的缩写,是Java平台的本地调用,从Java1.1就成为了Java标准的一部分,它允许Java代码和其它语言的代码进行互相调用,只要调用约定支持即可, ...

  8. Android JNI中C和JAVA代码之间的互相调用

    关于Android studio中使用NDK/JNI环境和入门:http://blog.csdn.net/quan648997767/article/details/64923143 1. C代码回调 ...

  9. Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用

    转自: http://blog.csdn.net/jiangwei0910410003/article/details/17466369 上一篇说道JNIEnv中的方法的用法,这一篇我们就来通过例子来 ...

随机推荐

  1. php学习之道:php中soap的使用实例以及生成WSDL文件,提供自己主动生成WSDL文件的类库——SoapDiscovery.class.php类

    1. web service普及: Webservice soap wsdl差别之个人见解 Web Service实现业务诉求:  Web Service是真正"办事"的那个,提供 ...

  2. 《深入理解OSGi:Equinox原理、应用与最佳实践》笔记_1_运行最简单的bundlehelloworld

    <深入理解OSGi:Equinox原理.应用与最佳实践>笔记_1_运行最简单的bundlehelloworld 买了周大大的OSGI的书看 先前完全没有基础 就靠这本书看看学学 顺便记一些 ...

  3. java 采用MD5加密解密

    MD5加密解密 package endecrypt; import java.io.UnsupportedEncodingException; import java.security.Message ...

  4. Java 二次MD5 32位小写加密算法与php页面加密结果相同

    最近做的一个项目需要使用MD5加密算法,需要加密的参数有两个.自己先试了几次,算的结果为php页面的不一样,后来与写php页面的同事沟通后,了解到php页面的算法如下: action = " ...

  5. ID设计

    ID设计 在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时 ...

  6. CCNA CCNP CCIE所有实验名称完整版

    实验1:通过Console端口访问Cisco路由器  实验2:通过Telnet访问Cisco路由器  实验3:配置终端服务器  实验4:通过浏览器访问路由器  实验5:模式切换.上下文帮助及查看有关信 ...

  7. Conversion to Dalvik format failed with error 1

    主要和添�的第三方的包有关系. ======================================= 出现,Conversion to Dalvik format failed with e ...

  8. lightoj1027(期望dp)

    有一个迷宫,有n个门,走每个的概率都是相同的 每个门有一个数字,如果是正数ai,那么表示走ai天就能走出迷宫,如果是负数,那么走-ai天会回到原地,然后会忘记之前的事情,继续选择门去走 所以,如果都是 ...

  9. BZOJ 3172([Tjoi2013]单词-后缀数组第一题+RMQ)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 268   Solved: 145 [ Submit][ St ...

  10. 发现C++Builder 2010一组类BUG

        今天C++Builder 2010写小码,我们用一个集合类.您可以设置操作结果是不正确的,排除其他原因引起的,最后,它应该被设置以确定问题类的源,以下是一个集合类测试代码: enum TTes ...