zoukankan      html  css  js  c++  java
  • Android JNI开发摘录(二)之JNI数组处理

          一. JNI中的数组

         1. 基本类型对应的本地数组

    基本数据类型

    本地数组

    boolean

    jbooleanArray

    byte

    jbyteArray

    char

    jcharArray

    short

    jshortArray

    int

    jintArray

    long

    jlongArray

    float

    jfloatArray

    object

    jobjectArray

    double

    jdoubleArray

        2. 数组操作函数

        数组函数分为用于对象数组的数组函数和用于基本数据类型数组的数组函数。GetArrayLength函数获取数组长度,可用于任意数组:

      jsize GetArrayLength(j[Type]array array);//Type用基本类型替换

     

       (1)用于对象数组的函数(如String数组,以对象数组传入JNI,再取出每个元素转化为jstring使用):

     

      /*<1>创建对象数组,下面的函数创建一个长度为length,并且持有类型为elementClass的对象的对象数组,数组中的所有元素都被置为initialElement*/

    jobjectArray NewObjectArray(jsize length, jclass elementClass, jobject initialElement );

    /* <2>获取数组元素,下面的函数通过Index指定的索引在array中获取一个对象,如果索引超出边界,会抛出一个IndexOutOfBoundsException*/

    jobject GetObjectArrayElement(jobjectArray array, jsize Index);

    /*<3>设置元素值。下面的函数在array中通过index指定的索引处设置元素值为value,如果index超出边界,会抛出一个IndexOutOfBoundException*/

    void SetObjectArrayElement(jobjectArray array, jsize index,jobject value);

     

       (2)用于基本类型的数组的函数

     

    Type

    ArrayType

    NativeType

    boolean

    jbooleanArray

    jboolean

    byte

    jbyteArray

    jbyte

    char

    jcharArray

    jchar

    short

    jshortArray

    jshort

    int

    jintArray

    jint

    long

    jlongArray

    jlong

    float

    jfloatArray

    jfloat

    double

    jdoubleArray

    jdouble

        

         /*<1>创建数组,下面函数创建一个包含length个元素的Java数组:*/

    [ArrayType] New[Type]Array(jsize length);

    /* <2>获取数组元素,下面的函数返回一个指向本机类型数组的指针,该类型与Java数据类型相对应。如果存储器从Java代码返回数组的一个副本,则参数isCopy被置为JNI_TRUE,否则置为JNI_FALSE:*/

    [NativeType] *Get[Type]ArrayElements([ArrayType] array, jboolean *isCopy);

    /*<3>释放数组指针。下面的函数释放从Get[Type]ArrayElements调用中获得的存储器空间。如果本机数组不是一个副本,那么模式(mode)参数可以被用来有选择的从本机数组复制存储器内容 回Java数组。模式的值以及它们的效果如下表:*/

    void Release[Type]ArrayElements([ArrayType] array,[NativeType] *elems, jint mode);

     

    mode

    Effect

    0

    从本机数组复制存储器内容到Java数组,并且回收被本机数组使用的存储器

    JNI_COMMIT

    从本机数组复制存储器内容到Java数组,但是不回收被本机数组使用的存储器

    JNI_ABORT

    不从本机数组复制存储器内容到Java数组,但是回收被本机数组使用的存储器

     

       

     /*<4>其他操作

    ①下面的函数功能同Get[Type]ArrayElements很相似。但是,它只用于一个数组子集的复制操作。参数start指定了从何处复制的起始索引,参数len则指定了从数组中复制到本机数组的多个位置数量:
    */

    void Get[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);

    /* ②下面的函数是Get[Type]ArrayRegion的一个副本。这个函数用来复制本机数组的一段内容回Java数组中。元素一般从本机数组起始处(索引为0)开始复制,但是只是从位置start开始将len个元素复制到Java数组中:*/

    void Set[Type]ArrayRegion([ArrayType] array, jsize start, jsize len, [NativeType] *buf);

    /* ③下面的函数在获得数组上的锁后将返回一个句柄给数组。如果没有建立任何锁,则isCopy被置为JNI_TRUE,否则置为NULL或JNI_FALSE:*/

    void *GetPrimitiveArrayCritical([ArrayType] array, jboolean *isCopy);

    /*④下面的函数释放从GetPrimitiveArrayCritical调用中返回的数组。mode的效果如下表:*/

    void ReleasePrimitiveArrayCritical([ArrayType] array, void *carray, jint mode);

     

    mode

    Effect

    0

    carray中复制值到数组中,并释放分配给carray的存储器

    JNI_COMMIT

    carray中复制值到数组中,但是不释放分配给carray的存储器

    JNI_ABORT

    不从carray中复制值到数组中

  • 相关阅读:
    idea使用之myeclipse项目迁移到idea
    启用Windows10的Linux子系统并安装图形界面
    Structs2+spring+hibernate+JPA整合
    微信小程序 跳转页面
    flutter 环境配置
    微信小程序 接口改为promise 由异步改为同步解决多层异步回调
    微信小程序 canvas绘制图片并下载
    微信小程序授权认证 操作
    html5 移动端页面软键盘弹出影响页面布局
    js移动端软件盘弹出隐藏处理
  • 原文地址:https://www.cnblogs.com/oxgen/p/2380286.html
Copyright © 2011-2022 走看看