Android NDK对于我们的作用和基本常识在 Android NDK开发技巧一 中已经讲明了,今天谈论下实战的技巧吧
1. 在JNI中打印Logcat,首先我们需要在cpp文件中加入 #include <android/log.h> 这个头文件,NDK有关android自己的就给我们这个唯一的文件log.h,其他的需要我们自己hack diy来解决。
jstring jlog; //从Java传来需要打印的字符
jboolean isCopy;
const char * szLog = (*env)->GetStringUTFChars(env, jlog, &isCopy); //将java的unicode字符转化为utf8字符
__android_log_print(ANDROID_LOG_WARN, “android123-cwj”, "from ndk = %s", szLog); //打印logcat
(*env)->ReleaseStringUTFChars(env, jlog, szLog); // 释放内存
}
上面这段比较简单,其中使用__android_log_print函数打印Logcat,第一个参数为log的level,在log.h头文件中 定义了 ANDROID_LOG_UNKNOWN = 0、 ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
ANDROID_LOG_SILENT
等类型,第二个参数为tag标签,第三个为需要打印的字符。整个例子比较简单,但方便了很多调试。
2. Android NDK给我们提供了zlib库的支持,可以通过本地的方法解压缩zip文件。
3. 有关C语言运行库的一些方法,在string.h文件中描述的比较清楚,可以方便的操作字符串 ,比如
- extern void* memccpy(void *, const void *, int, size_t);
- extern void* memchr(const void *, int, size_t);
- extern void* memrchr(const void *, int, size_t);
- extern int memcmp(const void *, const void *, size_t);
- extern void* memcpy(void *, const void *, size_t);
- extern void* memmove(void *, const void *, size_t);
- extern void* memset(void *, int, size_t);
- extern void* memmem(const