#include #include "org_gvsig_addo_Jaddo.h" #include "gdal.h" #include "cpl_string.h" jobject *jni_obj; JNIEnv *jni_env; int incrementFnc( double dfComplete, const char *pszMessage, void * pProgressArg ) { jclass class_incr; jmethodID method; int value = 0; value = (int)(dfComplete * 100); class_incr = (*jni_env)->FindClass (jni_env, "org/gvsig/addo/IOverviewIncrement"); method = (*jni_env)->GetMethodID(jni_env, class_incr, "setPercent", "(I)V"); (*jni_env)->CallVoidMethod(jni_env, (*jni_obj), method, value); return 1; } JNIEXPORT jint JNICALL Java_org_gvsig_addo_Jaddo_buildOverviewsNative (JNIEnv *env, jobject obj, jint method, jstring file, jintArray values) { int err = 0; jsize lon = 0; int i = 0; jint *listValues = NULL; GDALDatasetH *poDataset; int anLevels[1024]; const char * pszResampling = "nearest"; const char *filename = (*env)->GetStringUTFChars(env, file, 0); lon = (*env)->GetArrayLength(env, values); jni_obj = &obj; jni_env = env; listValues = (*env)->GetIntArrayElements(env, values, 0); for (i = 0; i < lon; i++) { anLevels[i] = listValues[i]; } switch(method) { case 0: pszResampling = "nearest"; break; case 1: pszResampling = "average"; break; case 2: pszResampling = "average_mp"; break; case 3: pszResampling = "average_magphase"; break; case 4: pszResampling = "mode"; break; } GDALAllRegister(); poDataset = GDALOpen( filename, GA_Update ); if( poDataset == NULL ) poDataset = GDALOpen( filename, GA_ReadOnly ); if( poDataset == NULL ) { (*env)->ReleaseIntArrayElements(env, values, listValues, 0); (*env)->ReleaseStringUTFChars(env, file, filename); return CE_Fatal; } err = GDALBuildOverviews( poDataset, pszResampling, lon, anLevels, 0, NULL, incrementFnc, NULL ); if( err != CE_None ) { (*env)->ReleaseIntArrayElements(env, values, listValues, 0); (*env)->ReleaseStringUTFChars(env, file, filename); return err; } GDALClose(poDataset); GDALDestroyDriverManager(); (*env)->ReleaseIntArrayElements(env, values, listValues, 0); (*env)->ReleaseStringUTFChars(env, file, filename); return -1; }