Android JNI开发摘录(一)之JNI串处理
Java本机接口
JNI提供许多函数,例如串和数组的处理,以及创建和使用Java对象的一个完整函数集。这些函数都使用一个指向Java环境的指针作为第一个参数。然而为了简化编程,这些函数都在JNIEnv结构中定义了一个别名。这就意味着可以通过指向Java环境的指针JNIEnv来调用任意的JNI函数。以下依次介绍JNIEnv结构中定义的函数。
NDK编译命令:$NDK/ndk-build -C [Project Path] 如:$NDK/ndk-build -C D:/Android/MyProject
获取方法和变量描述符的编译命令:javap -s -classpath . [PacketName+"."+Library Name] 如:javap -s -classpath . com.example.MyProject.MyLibrary
编译JNI头文件的命令(需要在开始包名(即com)的上一级目录调用):javah -classpath . [PacketName+"."+Library Name] 如:javah -classpath . com.example.MyProject.MyLibrary
调用JNI函数用两种方式:
//For C:
(*env)->NewStringUTF(env,"Hello World!");
//As alternative
(**env).NewStringUTF(env,"Hello World!");
//For C++:
env->NewStringUTF("Hello World!");
一. 数据类型
JNI环境中使用的数据类型称为本机类型,下面是基本类型和本机类型的对应关系表。
基本类型 |
本机类型 |
长度/bit |
boolean |
jboolean |
8,无符号(1Byte) |
byte |
jbyte |
8 |
char |
jchar |
16 |
short |
jshort |
16 |
int |
jint |
32 |
long |
jlong |
64 |
float |
jfloat |
32 |
double |
jdouble |
64 |
void |
void |
n/a |
二. JNI中的串处理函数
1.新建jstring
1 jstring NewString(const jchar *unicodeChars, jsize len);//创建Unicode格式的jstring串
2
3 jstring NewStringUTF(const char *bytes); //创建UTF-8格式的jstring串
2.获取字符串长度
jsize GetStringLength(jstring string);//Unicode
jsize GetStringUTFLength(jstring string);//UTF-8
3.jstring转化为C串及释放jstring串
/**
*如果生成串的一个副本,isCopy参数将被置为JNI_TRUE,否则置为
*NULL或者JNI_FALSE
*/
const jchar* GetStringChars(jstring string, jboolean *isCopy);
const char* GetStringUTFChars(jstring string, jboolean *isCopy );
注:这两个函数返回一个指向特定jstring中字符顺序的指针,该指针保持有效直到下面的函数被调用:
void ReleaseStringChars(jstring string, const jchar *chars);
void ReleaseStringUTFChars(jstring string, const char *utf);
GetStringRegion函数将串str的一个子串传送到一个字符缓存器。该子串在位置start处开始,在len-1处结束(这样传送的字符数就是len)。这将会抛出一个StringIndexOutOfBoundsException:
void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf);
void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf);
GetStringCritical函数返回一个指向特定串中字符的指针。如果有必要,复制该字符,并且函数返回时将isCopy置为JNI_TRUE,否则置为NULL或JNI_FALSE。在调用该函数后,直至调 用ReleaseStringCritical之前,所使用的所有函数都无法使当前线程被阻塞:
const jchar* GetStringCritical(jstring string, jboolean *isCopy);
void ReleaseStringCritical(jstring string,const jchar *carray);