編輯:高級開發
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來寫常規應用相信更有競爭力。
在android這一手機操作系統中,有很多比較新的功能和特性值得我們去深入的研究。比如今天為大家介紹的android菜單系統就是其中一個比較基礎的方面,需要我們通過各種
創建好看的android布局是個不小的挑戰,當你花了數小時調整好它們適應多種設備後,你通常不想再重新調整,但笨重的嵌套布局效率往往非常低下,幸運的是,在android
隨著Google的android手機和蘋果的iPhone手機的逐漸普及,越來越多開發者加入到移動應用開發的大軍當中。目前移動終端中的冠亞軍android,應用是基於Ja
下面進行對android技術的全解讀,首先要了解下什麼是Android語言,所謂android語言:基於Linux內核的軟件平台和操作系統,早期由Google開發,後由