學習Android Jni時,一個二維 整數 數組的傳遞花了我好長時間,在網上查的資料都不全,當然最后是成功了,寫在這里是為了自己記住,當然有人搜索到並利用了我會很高興。
in Android Java file
public native boolean add(
int[][] qizidata,.....)
用JDK工具生產jni 的*.h文件
your project path> ..Javajdk1.6.0_10binjavah -classpath ./bin
JAVA Class name
//**************************************************************************
//二維數組java -》Jni
JNIEXPORT jint JNICALL Java_com_Jung_add
(JNIEnv * env, jobject obj, jobjectArray qizidata,jint value1, jint value2)
{
jint i,j;
jint qizi[1024][1024];
//固定數組,測試用
jarray myarray;
int size = (*env)->GetArrayLength(env, qizidata);
for (i = 0; i < size && i<1024 ; i++)
{
myarray = ((*env)->GetObjectArrayElement(env, qizidata, i));
int col = (*env)->GetArrayLength(env, myarray);
jint *coldata = (*env)->GetIntArrayElements(env, (jintArray)myarray, 0 );
for (j=0; j<col && j <1024; j++)
{
qizi[i][j] = coldata[j];
}
(*env)->ReleaseIntArrayElements(env, (jintArray)myarray, coldata,0 );
}
return (qizi[0][0]+qizi[9][0]);
}
//**************************************************************************
//二維數組Jni -》Java
JNIEXPORT jobjectArray JNICALL Java_com_marakana_NativeLib_GetIntArray
(JNIEnv *env, jobject obj, jint x, jint y)
{
(JNIEnv *env, jobject obj, jint x, jint y)
{
jobjectArray ret;
int i = 0;
int j = 0;
jclass intArrCls = (*env)->FindClass(env, "[I");
if ( NULL== intArrCls)
return NULL;
ret = (*env)->NewObjectArray(env, x * y, intArrCls, NULL);
jint tmp[1024];
//固定數組,測試用,注意別溢出
for (i = 0; i < x; i++) {
jintArray intArr = (*env)->NewIntArray(env,y);
for (j = 0; j < y; j++) {
tmp[j] = i + j;
}
(*env)->SetIntArrayRegion(env,intArr, 0, y, tmp);
(*env)->SetObjectArrayElement(env,ret, i, intArr);
(*env)->DeleteLocalRef(env,intArr);
}
return ret;
}
//**************************************************************************
//下面代碼是網上搜的,沒驗證,忘記出處了,請原作者見諒
// 二維String數組 JNI 提取 c_languge syntax
JNIEXPORT void JNICALL Java_TestArray_PrintArrays
(JNIEnv *env, jclass class, jobjectArray array)
{
int size = (*env)->GetArrayLength(env, array);
for (int i = 0; i < size; i++)
{
jarray myarray = ((*env)->GetObjectArrayElement(env, array, i));
int leng = (*env)->GetArrayLength(env, myarray);
printf("length: %dn", leng);
for (int j = 0; j < leng; j++)
{
jstring string = ((*env)->GetObjectArrayElement(env, myarray, i));
const char * chars = (*env)->GetStringUTFChars(env, string, 0);
printf("%s n", chars);
(*env)->ReleaseStringUTFChars(env, string, chars);
}
}
}
