Android-NDK开发之基础--Android NDK开发技巧二

转载 2012年03月29日 17:53:04

原文:http://www.android123.com.cn/androidkaifa/682.html

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来写常规应用相信更有竞争力。

NDK开发 从入门到放弃(一:基本流程入门了解)

NDK入门,配置与简单流程介绍
  • xiaoyu_93
  • xiaoyu_93
  • 2016年10月20日 11:54
  • 16429

Android NDK开发技术与技巧总结与心得

Android NDK开发技术与技巧总结与心得
  • u010375364
  • u010375364
  • 2016年07月09日 09:27
  • 1243

Android NDk 开发简易教程

转载标明出处: 要解决的问题: Android代码调用 优秀的C++代码,高效的实现需要的功能。 总体的思路: 1. 完成 自己的Android代码; 2. 将c++代码生成 .so; 3....
  • u012192662
  • u012192662
  • 2015年04月30日 13:15
  • 4699

Android NDK开发技巧一、二

转自:http://www.android123.com.cn/androidkaifa/678.html 一: 平时我们开发Android应用时可能部分要求由于性能问题需要使用NDK...
  • Skypine_Lee
  • Skypine_Lee
  • 2012年03月02日 10:55
  • 523

Android NDK开发技巧二

Android NDK对于我们的作用和基本常识在 Android NDK开发技巧一  中已经讲明了,今天谈论下实战的技巧吧   1. 在JNI中打印Logcat,首先我们需要在cpp文件中加入 #in...
  • leilu2008
  • leilu2008
  • 2011年04月07日 16:27
  • 1097

Android NDK开发技巧二

原文: http://www.android123.com.cn/androidkaifa/682.html 为什么转帖呢? 原帖的背景看起来好费力啊..   Android NDK相关的开发技巧我们...
  • infsafe
  • infsafe
  • 2011年03月09日 17:36
  • 1238

Android NDK 开发教程二

  • 2015年08月03日 17:42
  • 22KB
  • 下载

Android NDK开发技术与技巧总结

Android NDK技术深度总结,同时提供了一些作者自己研究的开发技巧,尤其是C开发时JNI源码的自动提示和测试技巧...
  • amurocrash
  • amurocrash
  • 2016年07月08日 14:34
  • 3465

Linux Android NDK r7开发技巧,应用程序/库

近来有需求在Android下开发程序,由于性能的需求,不能使用java语言来实现效率要求较高的代码; 下载了最新的r7 NDK,解压到某一Linux目录 1.设置环境变量,下面语句加入到.bash...
  • civita
  • civita
  • 2011年12月21日 13:40
  • 918

Android NDK开发基础-------环境搭建1

搭建这个环境差不多弄了一天,唉~  真是不容易啊! 详细搭建步骤如下: 1、Android 开发环境搭建 Android开发环境搭建不是重点,相信看此文章的很多人都已经搭建成功,这里随便概述性的...
  • aa4790139
  • aa4790139
  • 2012年03月13日 16:54
  • 2872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android-NDK开发之基础--Android NDK开发技巧二
举报原因:
原因补充:

(最多只允许输入30个字)