主题:
●Java和JNI之间的数据对应关系
●数组操作
●相关数据处理函数,如字符串的创建,运算,转换
1. Java和JNI之间的数据对应关系
很多人都很疑惑为什么要定义数的数据类型呢,为什么不延用Java中的定义呢,
有这个疑惑的童鞋是平时没有注意数据类型大小的定义,Android这么做目的是因为Java中的基本数据类型的字节长度,并不是根据cpu的运算能力来定义的,如int在java中永远是4字节长,所以android这么做是为了兼容java的定义。
android jni 数据类型都定义在jni.h中的,我们贴出来方便大家平时的检阅:
typedef uint8_t jboolean; /* unsigned 8 bits */
typedef int8_t jbyte; /* signed 8 bits */
typedef uint16_t jchar; /* unsigned 16 bits */
typedef int16_t jshort; /* signed 16 bits */
typedef int32_t jint; /* signed 32 bits */
typedef int64_t jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
typedef jint jsize;
class _jobject {};
class _jclass : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
class _jobjectArray : public _jarray {};
class _jbooleanArray : public _jarray {};
class _jbyteArray : public _jarray {};
class _jcharArray : public _jarray {};
class _jshortArray : public _jarray {};
class _jintArray : public _jarray {};
class _jlongArray : public _jarray {};
class _jfloatArray : public _jarray {};
class _jdoubleArray : public _jarray {};
class _jthrowable : public _jobject {};
typedef _jobject* jobject;
typedef _jclass* jclass;
typedef _jstring* jstring;
typedef _jarray* jarray;
typedef _jobjectArray* jobjectArray;
typedef _jbooleanArray* jbooleanArray;
typedef _jbyteArray* jbyteArray;
typedef _jcharArray* jcharArray;
typedef _jshortArray* jshortArray;
typedef _jintArray* jintArray;
typedef _jlongArray* jlongArray;
typedef _jfloatArray* jfloatArray;
typedef _jdoubleArray* jdoubleArray;
typedef _jthrowable* jthrowable;
typedef _jobject* jweak;
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
2. 数组操作
1)获取长度
jarray array;
env->GetArrayLength(array)
2)访问数组元素
这个要取决于数组是对象还是基本数据类型。
对象数组:
jobjectArray array = ... ;
int i, j;
jobject object = env->GetObjectArrayElement(array, i);
env->GetObjectArrayElement(array, j, x);
基本数据:
xxx* a = env->GetxxxArrayElements(array, null) //把xxx换成double, int, boolean等等
然后可以a[i]来访问
用完以后一定要用下面的方法去Release, 这样才会把修改写回实现的地址。
env->ReleasexxxArrayElements(array, a, 0);
大范围数组元素操作
void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, jboolean* buf) //buf用来返回数组段的起始地址
void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, const jboolean* buf)
3)创建Java数组
jobjectArray array = env->NewObjectArray(100, clazz, NULL); // 100表示长,clazz java类对象, NULL类对象
jdoubleArray array = env->NewDoubleArray(100); //创建基本数据类型数组
3. 字符串操作
jstring NewString(const jchar* unicodeChars, jsize len)
jsize GetStringLength(jstring string)
const jchar* GetStringChars(jstring string, jboolean* isCopy)
void ReleaseStringChars(jstring string, const jchar* chars)
jstring NewStringUTF(const char* bytes)
jsize GetStringUTFLength(jstring string)
const char* GetStringUTFChars(jstring string, jboolean* isCopy)
void ReleaseStringUTFChars(jstring string, const char* utf)