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