JNI层数组的处理

原创 2013年12月03日 16:31:51

1.使用数组作为参数

JNIEXPORT void JNICALL
Java_org_davidliebman_android_awesomeguy_Panel_setTileMapData(JNIEnv * env, jobject  obj,
jintArray a_bitmap, jintArray b_bitmap, jintArray c_bitmap, jintArray d_bitmap)
{
  //jsize a_len = (*env)->GetArrayLength(env, a_bitmap);
  jint *a = (*env)->GetIntArrayElements(env, a_bitmap, 0);
  //jsize b_len = (*env)->GetArrayLength(env, b_bitmap);
  jint *b = (*env)->GetIntArrayElements(env, b_bitmap, 0);
  //jsize c_len = (*env)->GetArrayLength(env, c_bitmap);
  jint *c = (*env)->GetIntArrayElements(env, c_bitmap, 0);
  //jsize d_len = (*env)->GetArrayLength(env, d_bitmap);
  jint *d = (*env)->GetIntArrayElements(env, d_bitmap, 0);
  setTileMapData(a, b, c, d );
}

代码中传进去的jintArray类型需要进行转换才能给C/C++代码使用,其中GetArrayLength是获取数组长度,GetArrayElements是获取数组指针

JAVA端的代码就如下:

public native void setTileMapData( int [] a, int [] b, int [] c, int [] d);


2.返回类型是数组

JNIEXPORT jintArray JNICALL
Java_org_davidliebman_android_awesomeguy_Panel_drawLevel(JNIEnv * env, jobject  obj,
jint animate)
{
        int j,k;
        jint size = SCREEN_WIDTH * SCREEN_HEIGHT;
        jint fill[size]; 
        jintArray graphic;
        drawLevel(animate);
        graphic = (*env)->NewIntArray(env, size);
        if(graphic == NULL) {
                LOGE("ARRAY NOT CREATED");
                return NULL;
        }
        for (j = 0; j < SCREEN_HEIGHT; j++) {
                for (k = 0; k < SCREEN_WIDTH ; k ++ ) {
                        fill[ (j * SCREEN_WIDTH) + k ] = (jint) screen[j][k];
                }
        }
        
        
        (*env)->SetIntArrayRegion(env, graphic,0, size, fill);
        return graphic;
}


首先,在C/C++中使用数组来存储的数据,通过SetIntArrayRegion函数来转换成jintArray返回

JAVA端代码就这样:

public native int[] drawLevel(int num);



关于android中JNI层的理解

关于JNI的理解   在android的平台上,JNI(Java native interface)是连接Java层和native层的一座桥梁。其实就是说JNI是Java调用native方法的一个...
  • hellofeiya
  • hellofeiya
  • 2012年11月07日 19:30
  • 1703

Java层与Jni层的数组(buffer)传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni...
  • chinabinlang
  • chinabinlang
  • 2016年02月18日 15:08
  • 1463

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni...
  • xinchen200
  • xinchen200
  • 2014年05月08日 19:08
  • 25813

Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组

一:前面我们介绍了一级指针的相关概念和用发,今天我们就来说一说多级指针。1.定义多级指针#include #include /** 多级指针 指针指向的还是是内存地址 */...
  • a_zhon
  • a_zhon
  • 2016年11月24日 23:03
  • 906

JNI传递字符串数组J-StringArray

编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写。         参考...
  • wishchin
  • wishchin
  • 2015年08月04日 11:56
  • 2621

JNI中C和java传递数组

MainActivity package com.example.arraydeliver; import android.app.Activity; import android.app.Act...
  • disadministrator
  • disadministrator
  • 2015年04月24日 16:23
  • 818

Java JNI 入门篇——传递数组与修改数组

Java JNI 入门篇——传递数组与修改数组
  • guchuanhang
  • guchuanhang
  • 2016年11月30日 15:55
  • 1037

JNI基础(五)java调C,并且传递数组

java调用C代码,传递数组并且操作,是如何进行的? java代码: public class JNI { /** * 加载动态链接库 * 也就是c代码编译好的so文件 ...
  • sinat_31311947
  • sinat_31311947
  • 2017年01月07日 18:28
  • 746

Android framework层JNI的使用浅析

JNI技术对于多java开发的朋友相信并不陌生,即(java native interface),本地调用接口,主要功能有以下两点: 1、java层调用C/C++层代码 2、C/C++层调用java层...
  • yuanzeyao2008
  • yuanzeyao2008
  • 2015年01月05日 12:27
  • 28782

JNI开发中native层与Java层的交互

在native层中对Java层进行交互的一切操作都离不开JNIEnv这个指针,里面包含了一系列对Java层的方法。 native层操作Java复杂对象 native方法声明 publ...
  • u011452747
  • u011452747
  • 2016年05月28日 01:44
  • 597
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI层数组的处理
举报原因:
原因补充:

(最多只允许输入30个字)