android JNI 系列 二

主题:

●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)
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值