- (example) ObjectArrayTest.java: calls a native method to create a two-dimensional array of int and then prints the content of the array.
class ObjectArrayTest {
private static native int[][] initInt2DArray(int size);
public static void main(String[] args) {
int len = 5;
int[][] i2arr = initInt2DArray(len);
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
System.out.print(" " + i2arr[i][j]);
}
System.out.println();
}
}
static {
System.loadLibrary("ObjectArrayTest");
}
}
- Generate C/C++ header file
ObjectArrayTest.h /* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ObjectArrayTest */
#ifndef _Included_ObjectArrayTest
#define _Included_ObjectArrayTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ObjectArrayTest
* Method: initInt2DArray
* Signature: (I)[[I
*/
JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
- Implementation of ObjectArrayTest.c
ObjectArrayTest.c
- The static native method initInt2DArray creates a two-dimensional array of the given size.
JNIEXPORT jobjectArray JNICALL
Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size)
{
jobjectArray result;
int i;
jclass intArrCls = (*env)->FindClass(env, "[I");
if (intArrCls == NULL) {
return NULL; /* exception thrown */
}
result = (*env)->NewObjectArray(env, size, intArrCls,
NULL);
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
for (i = 0; i < size; i++) {
jint tmp[256]; /* make sure it is large enough! */
int j;
jintArray iarr = (*env)->NewIntArray(env, size);
if (iarr == NULL) {
return NULL; /* out of memory error thrown */
}
for (j = 0; j < size; j++) {
tmp[j] = i + j;
}
(*env)->SetIntArrayRegion(env, iarr, 0, size, tmp);
(*env)->SetObjectArrayElement(env, result, i, iarr);
(*env)->DeleteLocalRef(env, iarr);
}
return result;
}
- FindClass(): to obtain a reference of the element class of the two-dimensional int array.
- FindClass() returns NULL and throws an exception if class loading fails. (for example, a missing class file or an out-of-memory condition)
- The "[I" argument to FindClass is the JNI class descriptor that corresponds to the int[ ] type in the Java programming language.
- NewObjectArray(): allocates an array whose element type is denoted by the intArrCls class reference.
- NewIntArray(): allocates the individual array elements.
- SetIntArrayRegion(): copies the contents of the tmp[ ] buffer into the newly allocated one-dimensional arrays.
- SetObjectArrayElement(): sets the jth element of the ith one-dimensional array has value i+j.
- DeleteLocalRef(): ensures that the virtual machine does not run out of the memory used to hold JNI references such as iarr.
- Generate shared library file - libObjectArrayTest.so
cc -shared -I/usr/local/jdk1.6.20_21/include -I/usr/local/jdk1.6.20_21/include/linux ObjectArrayTest.c -o libObjectArrayTest.so
- Run ObjectArrayTest output (size=5):
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
0 意見:
張貼留言