Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android NDK開發技巧二

Android NDK開發技巧二

編輯:中級開發

android NDK相關的開發技巧我們將在今後經常總結,方便網友參考,有關JNI的使用可以查看 android JNI開發入門篇 、android JNI開發提高篇android JNI開發進階篇 、android JNI開發高級篇 和 android JNI開發終極篇。

  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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved