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 void *, size_t, const void *, size_t); extern void memswap(void *, void *, size_t); extern char* strchr(const char *, int); extern char* strrchr(const char *, int); extern size_t strlen(const char *); extern int strcmp(const char *, const char *); extern char* strcpy(char *, const char *); extern char* strcat(char *, const char *); extern int strcasecmp(const char *, const char *); extern int strncasecmp(const char *, const char *, size_t); extern char* strdup(const char *); extern char* strstr(const char *, const char *); extern char* strcasestr(const char *haystack, const char *needle); extern char* strtok(char *, const char *); extern char* strtok_r(char *, const char *, char**); extern char* strerror(int); extern int strerror_r(int errnum, char *buf, size_t n); extern size_t strnlen(const char *, size_t); extern char* strncat(char *, const char *, size_t); extern char* strndup(const char *, size_t); extern int strncmp(const char *, const char *, size_t); extern char* strncpy(char *, const char *, size_t);

相信这些肯定比Java效率快上不少,至少有指针用,在处理字符串等方面效率可能是几百倍几千倍的提升。

4. NDK在I/O处理上会更有效率,比如提供了Socket和File的本地读写,在socket.h文件中包含了标准Socket的各种方法,可以处理 TCP和UDP报文,这样和C++服务器的互通,通过NDK解决,不用再为Java的类型字节对齐以及编码而烦恼。

__socketcall int socket(int, int, int); __socketcall int bind(int, const struct sockaddr *, int); __socketcall int connect(int, const struct sockaddr *, socklen_t); __socketcall int listen(int, int); __socketcall int accept(int, struct sockaddr *, socklen_t *); __socketcall int getsockname(int, struct sockaddr *, socklen_t *); __socketcall int getpeername(int, struct sockaddr *, socklen_t *); __socketcall int socketpair(int, int, int, int *); __socketcall int shutdown(int, int); __socketcall int setsockopt(int, int, int, const void *, socklen_t); __socketcall int getsockopt(int, int, int, void *, socklen_t *); __socketcall int sendmsg(int, const struct msghdr *, unsigned int); __socketcall int recvmsg(int, struct msghdr *, unsigned int); extern ssize_t send(int, const void *, size_t, unsigned int); extern ssize_t recv(int, void *, size_t, unsigned int); __socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t); __socketcall ssize_t recvfrom(int, void *, size_t, unsigned int, const struct sockaddr *, socklen_t *);

5. 当然了,对于我们开发最爽的还要属OpenGL ES了,在NDK中所有GL的函数,可以在gl.h和glext.h中查找到,最新版本NDK支持最新的OpenGL ES版本,可以方便移植iPhone上的3D游戏了。Android123已经成功将Cube例子用NDK改造运行,确实比Java来的更方便和亲切。

最后还是一句话,对于Java这种解释型语言不爽的Android开发者NDK才是你最明智的选择,如果你有C/C++的基础,可以解决很多开源项目的移 植工作,实现高级的功能,将Java程序员甩在脑后面,开发出色的UI,完全可以拍拖View的舒服,让OpenGL来写常规应用相信更有竞争力。

更多相关文章

  1. Android(安卓)APK加固后如何签名
  2. Android(安卓)访问Android(安卓)Wear数据层Api——同步Data Item
  3. Android.jar文件浅析
  4. 用smali实现Android(安卓)apk的简单汉化
  5. Android开发系列之调用WebService
  6. Android(安卓)Studio打包与依赖(jar、aar)
  7. cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上
  8. 详解Android通过修改配置文件设置wifi密码
  9. Android(安卓)引入FFmpeg库so文件

随机推荐

  1. Android Recovery模式
  2. android重用layout-include标签的使用
  3. 准备去实习了,java后端开发和android都学
  4. Android(安卓)引用外部项目库
  5. [Android(安卓)之美] 那些你不知道的APK
  6. [学习]创建一个Android工程
  7. Android SDK Manager更新不了的解决办法
  8. android 更改密码显示风格
  9. Linux Kernel and Android(安卓)休眠与唤
  10. Android ADT和SDK历史版本离线包下载地址