Header Ads

[Android NDK ] Passing JNI Arrays


1
2
3
4
5
6
7
8
9
JNIExport jint JNICALL Java_IntArray_sumArray(JNIEnv *env, jobject obj,
 jintArray arr){
  jsize len = *env->GetArrayLength(env,arr);
  jint *body = *env->GetIntArrayElements(env,arr,0);
  for (jint i = 0; i < len; ++i){
   sum += body[i];
  }
 *env->ReleastIntArrayElements(env, arr, body, 0);
}
JNI FunctionDescription
Get<Type>ArrayRegion
Set<Type>ArrayRegion
Copies the contents of primitive arrays to or from a pre-allocated C buffer.
Get<Type>ArrayElements
Release<Type>ArrayElements
Obtains a pointer to the contents of a primitive array. May return a copy of the array.
GetArrayLengthReturns the number of elements in the array.
New<Type>ArrayCreates an array with the given length.
GetPrimitiveArrayCritical
ReleasePrimitiveArrayCritical
Obtains or releases a pointer to the contents of a primitive array. These functions allow virtual machines to disable garbage collection while the native code accesses the contents of primitive arrays.
JNI Array Example program
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
class SortArray {
 private native int[] sort(int[] arr);  //native method 
 
 static   //static initializer code
 {
  System.loadLibrary("SortArray");
 } 
 
 public static void main(String[] args)
 {
  int iArr[] = {4,5,2,7,1,9}; // Input array
  int oArr[]; //Output array
 
  SortArray arr = new SortArray();
 
  System.out.println("Unsorted array: ");
  for(int i = 0; i < iArr.length; i++){
   System.out.println(iArr[i] + " ");
  }
 
  oArr = arr.sort(iArr);
 
  System.out.println("Sorted array: ");
  for(int i = 0; i < oArr.length; i++){
   System.out.println(oArr[i] + " ");
  }
 }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class SortArray */
 
#ifndef _Included_SortArray
#define _Included_SortArray
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     SortArray
 * Method:    sort
 * Signature: ([I)[I
 */
JNIEXPORT jintArray JNICALL Java_SortArray_sort
  (JNIEnv *, jobject, jintArray);
 
#ifdef __cplusplus
}
#endif
#endif
The C++ implementation file SortArray.cpp will be:
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
#include "SortArray.h"
#include "jni.h"
 
/*
 * Class:     SortArray
 * Method:    sort
 * Signature: ([I)[I
 */
JNIEXPORT jintArray JNICALL Java_SortArray_sort
    (JNIEnv *env, jobject obj, jintArray arr){
 
    jsize arrLength = env->GetArrayLength(arr);
    jintArray arrSorted = env->NewIntArray(arrLength); 
 
    jint *arrOut = NULL;
    arrOut = env->GetIntArrayElements(arr, 0);
 
    for(jsize x = 0; x < arrLength; x++){
        for(jsize y = 0; y < arrLength - 1; y++){
                        if(arrOut[y] > arrOut[y+1]){
    jsize temp = arrOut[y+1];
    arrOut[y+1] = arrOut[y];
    arrOut[y] = temp;
   }
  }
 }
 
    env->SetIntArrayRegion(arrSorted, 0, arrLength, arrOut);
    env->ReleaseIntArrayElements(arr, arrOut, 0);
 
    return arrSorted;
}

No comments:

Powered by Blogger.