JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象。阅读此文假设你已经了解了JNI与Java数据类型的映射关系,如果还不了解的童鞋,请移步《JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系》阅读。下面以int类型为例说明基本数据类型数组的访问方式,对象数组类型用一个创建二维数组的例子来演示如何访问:
一、访问基本类型数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
package com.study.jnilearn; // 访问基本类型数组 public class IntArray { // 在本地代码中求数组中所有元素的和 private native int sumArray(int[] arr); public static void main(String[] args) { IntArray p = new IntArray(); int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = i; } int sum = p.sumArray(arr); System.out.println("sum = " + sum); } static { System.loadLibrary("IntArray"); } } |
本地代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_study_jnilearn_IntArray */ #ifndef _Included_com_study_jnilearn_IntArray #define _Included_com_study_jnilearn_IntArray #ifdef __cplusplus extern "C" { #endif /* * Class: com_study_jnilearn_IntArray * Method: sumArray * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_com_study_jnilearn_IntArray_sumArray (JNIEnv *, jobject, jintArray); #ifdef __cplusplus } #endif #endif // IntArray.c #include "com_study_jnilearn_IntArray.h" #include <string.h> #include <stdlib.h> /* * Class: com_study_jnilearn_IntArray * Method: sumArray * Signature: ([I)I */ JNIEXPORT jint JNICALL Java_com_study_jnilearn_IntArray_sumArray (JNIEnv *env, jobject obj, jintArray j_array) { jint i, sum = 0; jint *c_array; jint arr_len; //1. 获取数组长度 arr_len = (*env)->GetArrayLength(env,j_array); //2. 根据数组长度和数组元素的数据类型申请存放java数组元素的缓冲区 c_array = (jint*)malloc(sizeof(jint) * arr_len); -e">sizeof(jint) * arr_len); ݥ访问和设置Java层的数组对象。阅读此文假设你已经了解了JNI与Java数据类型的映射关系,如果还不了解的童鞋,请移步《JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系》阅读。下面以int类型为例说明基本数据类型数组的访问方式,对象数组类型用一个创建二维数组的例子来演示如何访问:
一、访问基本类型数组
本地代码:
|