Android NDK開發技巧二

來源:互聯網
上載者:User

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);<br />extern void* memchr(const void *, int, size_t);<br />extern void* memrchr(const void *, int, size_t);<br />extern int memcmp(const void *, const void *, size_t);<br />extern void* memcpy(void *, const void *, size_t);<br />extern void* memmove(void *, const void *, size_t);<br />extern void* memset(void *, int, size_t);<br />extern void* memmem(const void *, size_t, const void *, size_t);<br />extern void memswap(void *, void *, size_t);<br />extern char* strchr(const char *, int);<br />extern char* strrchr(const char *, int);<br />extern size_t strlen(const char *);<br />extern int strcmp(const char *, const char *);<br />extern char* strcpy(char *, const char *);<br />extern char* strcat(char *, const char *);<br />extern int strcasecmp(const char *, const char *);<br />extern int strncasecmp(const char *, const char *, size_t);<br />extern char* strdup(const char *);<br />extern char* strstr(const char *, const char *);<br />extern char* strcasestr(const char *haystack, const char *needle);<br />extern char* strtok(char *, const char *);<br />extern char* strtok_r(char *, const char *, char**);<br />extern char* strerror(int);<br />extern int strerror_r(int errnum, char *buf, size_t n);<br />extern size_t strnlen(const char *, size_t);<br />extern char* strncat(char *, const char *, size_t);<br />extern char* strndup(const char *, size_t);<br />extern int strncmp(const char *, const char *, size_t);<br />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);<br />__socketcall int bind(int, const struct sockaddr *, int);<br />__socketcall int connect(int, const struct sockaddr *, socklen_t);<br />__socketcall int listen(int, int);<br />__socketcall int accept(int, struct sockaddr *, socklen_t *);<br />__socketcall int getsockname(int, struct sockaddr *, socklen_t *);<br />__socketcall int getpeername(int, struct sockaddr *, socklen_t *);<br />__socketcall int socketpair(int, int, int, int *);<br />__socketcall int shutdown(int, int);<br />__socketcall int setsockopt(int, int, int, const void *, socklen_t);<br />__socketcall int getsockopt(int, int, int, void *, socklen_t *);<br />__socketcall int sendmsg(int, const struct msghdr *, unsigned int);<br />__socketcall int recvmsg(int, struct msghdr *, unsigned int);<br />extern ssize_t send(int, const void *, size_t, unsigned int);<br />extern ssize_t recv(int, void *, size_t, unsigned int);<br />__socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);<br />__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來寫常規應用相信更有競爭力。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.