函數 |
Java數組本地C/C++類型 |
Java本地C/C++類型 |
GetBooleanArrayElements |
jbooleanArray |
Jboolean |
GetByteArrayElements |
jbyteArray |
Jbyte |
GetCharArrayElements |
jcharArray |
Jchar |
GetShortArrayElements |
jshortArray |
Jshort |
GetIntArrayElements |
jintArray |
Jint |
GetLongArrayElements |
jlongArray |
Jlong |
GetFloatArrayElements |
jfloatArray |
Jfloat |
GetDoubleArrayElements |
jdoubleArray |
Jdouble |
JNIEXPORT jobjectArray JNICALL Java_com_robin_HelloActivity_getStringArrayFromJni
(JNIEnv *env, jobject thiz)
{
jstring str;
jobjectArray args = 0;
jsize len = 5;
char* sa[] = { "Hello,", "world!", "This", "is", "robin" };
int i=0;
args = (env)->NewObjectArray(len,(env)->FindClass("java/lang/String"),0);
for( i=0; i < len; i++ )
{
str = (env)->NewStringUTF(sa[i] );
(env)->SetObjectArrayElement(args, i, str);
}
return args;
}
二維數組和String數組
在JNI中,二維數組和String數組都被視爲object數組,因爲數組和String被視爲object。仍然用一個例子來說明,這次是一個二維int數組,作爲返回值。
JNIEXPORT jobjectArray JNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size)
{
jobjectArray result;
jclass intArrCls = env->FindClass("[I");
result = env->NewObjectArray(size, intArrCls, NULL); //爲result分配空間
for (int i = 0; i < size; i++) {
jint tmp[256]; /* make sure it is large enough! */
jintArray iarr = env->NewIntArray(size); //爲一維int數組iarr分配空間
for(int j = 0; j < size; j++) {
tmp[j] = i + j;
}
env->SetIntArrayRegion(iarr, 0, size, tmp); //爲iarr賦值
env->SetObjectArrayElement(result, i, iarr); //result的第i個元素賦值
env->DeleteLocalRef(iarr);
}
return result;
}
上面代碼中的第三行,
jobjectArray result;
因爲要返回值,所以需要新建一個jobjectArray對象。
jclass intArrCls = env->FindClass("[I");
是創建一個jclass的引用,因爲result的元素是一維int數組的引用,所以intArrCls必須是一維int數組的引用,這一點是如何保證的呢?注意FindClass的參數"[I",JNI就是通過它來確定引用的類型的,I表示是int類型,[標識是數組。對於其他的類型,都有相應的表示方法,
Z boolean
B byte
C char
S short
I int
J long
F float
D double
String是通過“Ljava/lang/String;”表示的,那相應的,String數組就應該是“[Ljava/lang/String;”。
"二維數組和String數組"這部分所用到的函數調用方式都是針對C++的,如果要在C中使用,所有的env->都要被替換成(*env)->,而且後面的函數中需要增加一個參數env