Android NDK开发技巧二

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文件中描述的比较清楚,可以方便的操作字符串 ,比如

[cpp]  view plain copy
  1. extern void*  memccpy(void *, const void *, intsize_t);  
  2. extern void*  memchr(const void *, intsize_t);  
  3. extern void*  memrchr(const void *, intsize_t);  
  4. extern int    memcmp(const void *, const void *, size_t);  
  5. extern void*  memcpy(void *, const void *, size_t);  
  6. extern void*  memmove(void *, const void *, size_t);  
  7. extern void*  memset(void *, intsize_t);  
  8. extern void*  memmem(const void *, size_tconst void *, size_t);  
  9. extern void   memswap(void *, void *, size_t);  
  10. extern char*  strchr(const char *, int);  
  11. extern char*  strrchr(const char *, int);  
  12. extern size_t strlen(const char *);  
  13. extern int    strcmp(const char *, const char *);  
  14. extern char*  strcpy(char *, const char *);  
  15. extern char*  strcat(char *, const char *);  
  16. extern int    strcasecmp(const char *, const char *);  
  17. extern int    strncasecmp(const char *, const char *, size_t);  
  18. extern char*  strdup(const char *);  
  19. extern char*  strstr(const char *, const char *);  
  20. extern char*  strcasestr(const char *haystack, const char *needle);  
  21. extern char*  strtok(char *, const char *);  
  22. extern char*  strtok_r(char *, const char *, char**);  
  23. extern char*  strerror(int);  
  24. extern int    strerror_r(int errnum, char *buf, size_t n);  
  25. extern size_t strnlen(const char *, size_t);  
  26. extern char*  strncat(char *, const char *, size_t);  
  27. extern char*  strndup(const char *, size_t);  
  28. extern int    strncmp(const char *, const char *, size_t);  
  29. extern char*  strncpy(char *, const char *, size_t);  

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

 

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

[cpp]  view plain copy
  1. __socketcall int socket(intintint);  
  2. __socketcall int bind(intconst struct sockaddr *, int);  
  3. __socketcall int connect(intconst struct sockaddr *, socklen_t);  
  4. __socketcall int listen(intint);  
  5. __socketcall int accept(intstruct sockaddr *, socklen_t *);  
  6. __socketcall int getsockname(intstruct sockaddr *, socklen_t *);  
  7. __socketcall int getpeername(intstruct sockaddr *, socklen_t *);  
  8. __socketcall int socketpair(intintintint *);  
  9. __socketcall int shutdown(intint);  
  10. __socketcall int setsockopt(intintintconst void *, socklen_t);  
  11. __socketcall int getsockopt(intintintvoid *, socklen_t *);  
  12. __socketcall int sendmsg(intconst struct msghdr *, unsigned int);  
  13. __socketcall int recvmsg(intstruct msghdr *, unsigned int);  
  14. extern  ssize_t  send(intconst void *, size_t, unsigned int);  
  15. extern  ssize_t  recv(intvoid *, size_t, unsigned int);  
  16. __socketcall ssize_t sendto(intconst void *, size_tintconst struct sockaddr *, socklen_t);  
  17. __socketcall ssize_t recvfrom(intvoid *, size_t, unsigned intconst 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来写常规应用相信更有竞争力。

你可能感兴趣的:(java,android,socket,jni,iPhone,语言)