`

Android NDK相关的库方法

阅读更多

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 intmemcmp(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 intstrcmp(const char *, const char *);
extern char*  strcpy(char *, const char *);
extern char*  strcat(char *, const char *);

extern intstrcasecmp(const char *, const char *);
extern intstrncasecmp(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 intstrerror_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 intstrncmp(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来写常规应用相信更有竞争力。

分享到:
评论

相关推荐

    pcl-1.9.1 for android ndk21库

    这个"pcl-1.9.1 for android ndk21库"是专门为Android平台编译的PCL版本,它基于NDK21,这是Google发布的Android NDK的一个特定版本,提供了C和C++的交叉编译工具链,用于在Android应用中使用原生代码。NDK21支持...

    android ndk环境下移植libiconv方法 附源码

    `android ndk libiconv库移植方法.pdf`文档应该提供了更详细的移植步骤和注意事项,包括如何处理特定平台的依赖、编译选项的调整以及可能出现的问题及解决方案。在实际操作过程中,可能还需要根据Android版本和目标...

    CUPS打印AndroidNDK 静态库

    当涉及到“CUPS打印Android NDK 静态库”时,我们主要关注的是如何在Android应用中利用CUPS系统进行本地打印,并通过NDK将CUPS的静态库集成到Android项目中。 首先,我们需要理解Android NDK的基本工作原理。NDK...

    使用Android NDK编译Android平台的eXosip库

    本文将深入探讨如何使用Android NDK(Native Development Kit)来编译适用于Android平台的eXosip库,包括静态库和动态库的构建过程。 首先,eXosip是基于OSI(Open Systems Interconnection)模型的SIP协议栈,它是...

    android-ndk(android-ndk-r25b-windows.zip)

    6. **C++支持**:NDK支持C++11及更高版本,以及一些C++标准库,如STL,这使得C++开发者能在Android平台上更好地工作。 7. **LLVM/Clang支持**:NDK引入了LLVM/Clang作为替代GCC的编译器,提供了更好的性能和更现代...

    Android NDK环境配置

    Android NDK环境配置是Android应用开发中的一个重要环节,它允许开发者使用C或C++编写高性能的原生代码,这些代码可以被编译成动态库并与Java应用一同打包成APK。NDK集成了交叉编译器,使得开发者能够针对不同的CPU...

    android-ndk(android-ndk-r25b-linux.zip)

    在Android中,JNI是Android应用与NDK之间的重要桥梁,使得Java应用程序可以调用C/C++编写的本地库,同时C/C++代码也能调用Java的方法。 2. **NDK的优势**: - **性能优化**:对于计算密集型任务,例如图形处理、...

    android-ndk(android-ndk-r23b-windows.zip)

    2. **头文件和库**:NDK提供了Android系统的API头文件和必要的库文件,使得开发者可以访问Android系统服务,如硬件设备、多媒体、网络等。 3. **构建系统**:如Build.Gradle插件,使得在Android Studio中可以方便地...

    android-ndk(android-ndk-r23b-linux.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android...

    Android NDK使用Iconv进行编码转换

    Android NDK(Native Development Kit)提供了一种方法来实现这样的编码转换,这就是使用Iconv库。Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/...

    android使用NDK编译curl库源码

    在这个场景中,我们将探讨如何在Android环境下使用NDK(Native Development Kit)编译Curl库源码。 首先,NDK是Google提供的一个工具集,允许开发者在Android应用中集成原生代码。通过NDK,我们可以编写C和C++代码...

    android-ndk(android-ndk-r26b-darwin.zip)

    NDK允许开发者在Android应用中使用原生代码,以实现高性能、低级别的硬件交互以及利用已有的C/C++库。在本案例中,我们关注的是"android-ndk-r26b-darwin.zip",这是一个专为macOS系统设计的NDK版本。 **Android ...

    android-ndk(android-ndk-r26b-windows.zip)

    同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和调试工作。 在实际应用中,开发者需要注意NDK的使用可能会增加应用的复杂性,例如增加了调试难度,且需要关注不同设备间的兼容性问题。...

    Android NDK 开发教程二

    本文将详细介绍 Android NDK 的使用方法、注意事项以及其局限性。 #### 二、Android NDK 基础概念 ##### 2.1 Android NDK 介绍 Android NDK 是一套工具集合,它可以让开发者在 Android 平台上使用 C 和 C++ 编写...

    ubuntu下android ndk编译环境搭建详细描述

    在Ubuntu系统上搭建Android NDK编译环境是Android原生代码开发的重要步骤,适用于那些需要进行C/C++底层开发或优化的应用程序。Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用...

    androidndk开发实战

    这通常包括下载和安装NDK,设置Android Studio,配置路径变量,以及构建本地库项目。了解这些步骤是开始NDK编程的基础,因为没有正确配置的环境,就无法编译和调试C/C++代码。 接着,“Android NDK(r5b)环境搭建及...

    android-ndk(android-ndk-r25b-darwin.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个工具允许开发者在Android应用中使用原生代码,以实现高性能计算、图形处理、游戏引擎等复杂功能。`...

    android-ndk-r8dab.zip_NDK_android_android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具,它允许开发者使用C和C++编写部分应用代码,以利用设备的硬件性能或实现更底层的操作。在“android-ndk-r8dab....

    android-ndk(android-ndk-r26b-linux.zip)

    6. **第三方库集成**:许多开源的C/C++库可以与NDK结合使用,使得开发者可以直接在Android应用中利用这些库,比如OpenCV、FFmpeg等。 7. **C++11及更高版本支持**:随着NDK版本的更新,对C++标准的支持也在增强,...

    androidNDK调用opencv

    ### Android NDK调用OpenCV库详解 #### 一、前言 在移动应用开发领域,尤其是涉及到图像处理和计算机视觉的应用中,Android NDK(Native Development Kit)结合OpenCV库成为了开发者的首选方案之一。OpenCV(Open ...

Global site tag (gtag.js) - Google Analytics