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库"是专门为Android平台编译的PCL版本,它基于NDK21,这是Google发布的Android NDK的一个特定版本,提供了C和C++的交叉编译工具链,用于在Android应用中使用原生代码。NDK21支持...
`android ndk libiconv库移植方法.pdf`文档应该提供了更详细的移植步骤和注意事项,包括如何处理特定平台的依赖、编译选项的调整以及可能出现的问题及解决方案。在实际操作过程中,可能还需要根据Android版本和目标...
当涉及到“CUPS打印Android NDK 静态库”时,我们主要关注的是如何在Android应用中利用CUPS系统进行本地打印,并通过NDK将CUPS的静态库集成到Android项目中。 首先,我们需要理解Android NDK的基本工作原理。NDK...
本文将深入探讨如何使用Android NDK(Native Development Kit)来编译适用于Android平台的eXosip库,包括静态库和动态库的构建过程。 首先,eXosip是基于OSI(Open Systems Interconnection)模型的SIP协议栈,它是...
6. **C++支持**:NDK支持C++11及更高版本,以及一些C++标准库,如STL,这使得C++开发者能在Android平台上更好地工作。 7. **LLVM/Clang支持**:NDK引入了LLVM/Clang作为替代GCC的编译器,提供了更好的性能和更现代...
Android NDK环境配置是Android应用开发中的一个重要环节,它允许开发者使用C或C++编写高性能的原生代码,这些代码可以被编译成动态库并与Java应用一同打包成APK。NDK集成了交叉编译器,使得开发者能够针对不同的CPU...
Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个“android-ndk-r23b-linux.zip”文件是NDK的一个特定版本,即r23b,专为Linux操作系统设计。在Android...
2. **头文件和库**:NDK提供了Android系统的API头文件和必要的库文件,使得开发者可以访问Android系统服务,如硬件设备、多媒体、网络等。 3. **构建系统**:如Build.Gradle插件,使得在Android Studio中可以方便地...
在Android中,JNI是Android应用与NDK之间的重要桥梁,使得Java应用程序可以调用C/C++编写的本地库,同时C/C++代码也能调用Java的方法。 2. **NDK的优势**: - **性能优化**:对于计算密集型任务,例如图形处理、...
Android NDK(Native Development Kit)提供了一种方法来实现这样的编码转换,这就是使用Iconv库。Iconv是一个广泛使用的字符集转换工具,它允许在多种字符编码之间进行转换,包括Unicode、GBK和UTF-8。 Iconv在C/...
在这个场景中,我们将探讨如何在Android环境下使用NDK(Native Development Kit)编译Curl库源码。 首先,NDK是Google提供的一个工具集,允许开发者在Android应用中集成原生代码。通过NDK,我们可以编写C和C++代码...
- **生成动态库**:使用`ndk-build`或`cmake`构建工具,将静态库转化为动态库`.so`,针对不同的Android架构分别编译。 - **打包so库**:将编译得到的各个架构的.so文件整理到一个目录结构,符合Android的ABI分发...
同时,Android Studio提供了对NDK的集成支持,可以在IDE内进行NDK相关的开发和调试工作。 在实际应用中,开发者需要注意NDK的使用可能会增加应用的复杂性,例如增加了调试难度,且需要关注不同设备间的兼容性问题。...
NDK允许开发者在Android应用中使用原生代码,以实现高性能、低级别的硬件交互以及利用已有的C/C++库。在本案例中,我们关注的是"android-ndk-r26b-darwin.zip",这是一个专为macOS系统设计的NDK版本。 **Android ...
本文将详细介绍 Android NDK 的使用方法、注意事项以及其局限性。 #### 二、Android NDK 基础概念 ##### 2.1 Android NDK 介绍 Android NDK 是一套工具集合,它可以让开发者在 Android 平台上使用 C 和 C++ 编写...
在Ubuntu系统上搭建Android NDK编译环境是Android原生代码开发的重要步骤,适用于那些需要进行C/C++底层开发或优化的应用程序。Android NDK(Native Development Kit)是一套工具,允许开发者使用C/C++编写部分应用...
这通常包括下载和安装NDK,设置Android Studio,配置路径变量,以及构建本地库项目。了解这些步骤是开始NDK编程的基础,因为没有正确配置的环境,就无法编译和调试C/C++代码。 接着,“Android NDK(r5b)环境搭建及...
Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的C和C++库开发工具集。这个工具允许开发者在Android应用中使用原生代码,以实现高性能计算、图形处理、游戏引擎等复杂功能。`...
Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具,它允许开发者使用C和C++编写部分应用代码,以利用设备的硬件性能或实现更底层的操作。在“android-ndk-r8dab....
6. **第三方库集成**:许多开源的C/C++库可以与NDK结合使用,使得开发者可以直接在Android应用中利用这些库,比如OpenCV、FFmpeg等。 7. **C++11及更高版本支持**:随着NDK版本的更新,对C++标准的支持也在增强,...