Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libjni-gdal / src / bsb_interfaz.c @ 1010

History | View | Annotate | Download (8.95 KB)

1 716 igbrotru
/**********************************************************************
2
 * $Id$
3
 *
4
 * Name:     bsb_interfaz.c
5
 * Project:  JGDAL. Interface java to gdal (Frank Warmerdam).
6
 * Purpose:  Interface functions to manage bsb files. This include gdal
7
 *                         code but it doesn't use the gdal API.
8
 * Author:   Nacho Brodin, brodin_ign@gva.es
9
 *
10
 **********************************************************************/
11
/*Copyright (C) 2004  Nacho Brodin <brodin_ign@gva.es>
12

13
 This program is free software; you can redistribute it and/or
14
 modify it under the terms of the GNU General Public License
15
 as published by the Free Software Foundation; either version 2
16
 of the License, or (at your option) any later version.
17

18
 This program is distributed in the hope that it will be useful,
19
 but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 GNU General Public License for more details.
22

23
 You should have received a copy of the GNU General Public License
24
 along with this program; if not, write to the Free Software
25
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26
 */
27
28
#include <jni.h>
29 791 igbrotru
#include "es_gva_cit_jbsb_Bsb.h"
30 716 igbrotru
#include "bsb_read.h"
31
32
33
int tam;
34
BSBInfo *g_psInfo;
35
36
37
/****************************************************************/
38
/*Carga un objeto jobject a partir de una estructura BSBInfo*/
39
40
41
jobject cargarJobject(JNIEnv *env, BSBInfo *psInfo, jobject *ref){
42
43
   jclass class_bsbinfo;
44
   jfieldID id_campo;
45
   jobject obj_bsbinfo;
46
   jmethodID metodo;
47
   jshortArray jvect_short, array_strings;
48
   jintArray jvect_int;
49
   jshort *vect_short;
50
   jint *vect_int;
51
   jclass class_string;
52
   int i;
53
   int nitems_header;                //tama? de memoria reservada en papszHeader
54
   int cont_arrays;                        //Numero de arrays en papszHeader
55
   jlong jresult=0;
56
57
   //Obtenemos la direccion del BSBInfo
58
59
   *(BSBInfo **)&jresult = g_psInfo;
60
61
   //Calculamos el numero de bytes reservados del campo papszHeader
62
63
   cont_arrays=0;
64
   nitems_header=0;
65
   while(psInfo->papszHeader[cont_arrays]!=NULL){
66
    //printf("%s %d\n",psInfo->papszHeader[cont_arrays],cont_arrays);
67
    nitems_header+=strlen(psInfo->papszHeader[cont_arrays]);
68
    cont_arrays++;
69
   }
70
    //printf("%d %d\n",cont_arrays,sizeof(nitems_header));
71
72
   //obtenemos la clase BSBInfo y creamos un objeto de este tipo
73
74
   if(ref==NULL){
75
76 791 igbrotru
           class_bsbinfo = (*env)->FindClass (env, "es/gva/cit/jbsb/BsbInfo");
77 716 igbrotru
           metodo = (*env)->GetMethodID(env, class_bsbinfo, "reserva", "(III)V");
78
           obj_bsbinfo = (*env)->NewObject (env,class_bsbinfo,metodo,psInfo->nPCTSize*3,cont_arrays/*sizeof(nitems_header)*/,psInfo->nYSize);
79
80
81
    if(obj_bsbinfo!=NULL){
82
83
84
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nXSize", "I");
85
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nXSize);
86
87
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nYSize", "I");
88
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nYSize);
89
90
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nPCTSize", "I");
91
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nPCTSize);
92
93
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "cPtr", "J");
94
             (*env)->SetLongField(env, obj_bsbinfo, id_campo, jresult);
95
96
      //-----------------------------------------------------------------------
97
          //CARGAMOS EL CAMPO DE JOBJECT pabyPCT
98
          //-----------------------------------------------------------------------
99
100
             //printf("pabyPCT %d",psInfo->nPCTSize);
101
102
             vect_short = (jshort *) calloc(sizeof(jchar),(psInfo->nPCTSize*3));
103
             for(i=0;i<(psInfo->nPCTSize*3);i++){
104
                    vect_short[i]=(jchar)(psInfo->pabyPCT[i]);
105
             }
106
             jvect_short = (*env)->NewShortArray(env, psInfo->nPCTSize*3);
107
             if(jvect_short!=NULL){
108
               (*env)->SetShortArrayRegion(env, jvect_short, 0, psInfo->nPCTSize*3,(jshort *)vect_short);
109
               id_campo = (*env)->GetFieldID(env, class_bsbinfo, "pabyPCT", "[S");
110
               (*env)->SetObjectField(env, obj_bsbinfo, id_campo, jvect_short);
111
               free(vect_short);
112
             }else{
113
                             free(vect_short);
114
                             return NULL;
115
             }
116
117
118
119
             //printf("tama? papszHeader %d",nitems_header);
120
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "papszHeader", "[Ljava/lang/String;");
121
             class_string = (*env)->FindClass (env, "java/lang/String");
122
             array_strings=(*env)->NewObjectArray(env, cont_arrays, class_string, (*env)->NewStringUTF(env,""));
123
             if(array_strings!=NULL){
124
125
                     for(i=0;i<cont_arrays;i++)
126
                        (*env)->SetObjectArrayElement(env,array_strings,i,(*env)->NewStringUTF(env,psInfo->papszHeader[i]));
127
128
                    (*env)->SetObjectField(env, obj_bsbinfo, id_campo, array_strings);
129
130
             }else return NULL;
131
132
133
             //printf("tama? panLineOffset %d",sizeof(*psInfo->panLineOffset));
134
             vect_int = (jint *) calloc(sizeof(jint),psInfo->nYSize);
135
             for(i=0;i< psInfo->nYSize;i++){
136
                    vect_int[i]=(jint)(psInfo->panLineOffset[i]);
137
             }
138
             jvect_int = (*env)->NewIntArray(env, psInfo->nYSize);
139
             if(jvect_int!=NULL){
140
               (*env)->SetIntArrayRegion(env, jvect_int, 0, psInfo->nYSize,vect_int);
141
               id_campo = (*env)->GetFieldID(env, class_bsbinfo, "panLineOffset", "[I");
142
               (*env)->SetObjectField(env, obj_bsbinfo, id_campo, jvect_int);
143
               free(vect_int);
144
             }else{
145
                             free(vect_int);
146
                            return NULL;
147
             }
148
149
150
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nColorSize", "I");
151
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nColorSize);
152
153
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nVersion", "I");
154
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nVersion);
155
156
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "bNO1", "I");
157
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->bNO1);
158
159
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "bNewFile", "I");
160
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->bNewFile);
161
162
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nLastLineWritten", "I");
163
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nLastLineWritten);
164
165
    }else return NULL;
166
167
168
    return obj_bsbinfo;
169
   }else{
170
171
             return NULL;
172
   }
173
}
174
175
176
/****************************************************************/
177
/*Llamada a la funci? BSBOpen de bsb_read.c. Convierte los par?tros que viene de java
178
 * , llama a la funci? y construye el objeto para devolver el resultado*/
179
180
181 791 igbrotru
JNIEXPORT jobject JNICALL Java_es_gva_cit_jbsb_Bsb_bsbOpenNat(JNIEnv *env,
182 716 igbrotru
                                                                                                                        jobject obj,
183
                                                                                                                        jstring pszF)
184
{
185
186
187
  const char *pszFilename = (*env)->GetStringUTFChars(env, pszF, 0);
188
189
190
  g_psInfo = BSBOpen(pszFilename);
191
192
  (*env)->ReleaseStringUTFChars(env, pszF, pszFilename);
193
194
  return cargarJobject(env,g_psInfo,NULL);
195
196
}
197
198
199
200
/****************************************************************/
201
//Funci?n que encapsula a BSBReadLine cd bsb_read.c. Convierte los par?metros que viene de
202
// java y llama a la funci?n cd C que lee una linea.
203
204
205 791 igbrotru
JNIEXPORT jint JNICALL Java_es_gva_cit_jbsb_Bsb_bsbReadLineNat(        JNIEnv *env,
206 716 igbrotru
                                                                                                                                        jobject obj,
207
                                                                                                                                        jlong cPtr,
208
                                                                                                                                        jobject buf,
209
                                                                                                                                        jint nScanline,
210
                                                                                                                                        jstring pszF)
211
{
212
213
  int result;
214
  jfieldID id_campo;
215
  jclass class_buf;
216
  jbyteArray pabySLB;
217
  unsigned char *pabyScanLineBuf;
218
219
  g_psInfo  = (BSBInfo *) 0 ;
220
  g_psInfo = *(BSBInfo **)&cPtr;
221
222
223
  pabyScanLineBuf = (unsigned char *) malloc(g_psInfo->nXSize);
224
  class_buf = (*env)->GetObjectClass(env, buf);
225
226
227
228
  //-----------------------------------------------------------------------
229
  //Llamamos a la funci?n de libreria que lee una l?nea y la cargamos sobre
230
  //pabyScanLineBuf
231
  //-----------------------------------------------------------------------
232
233
  result = BSBReadScanline(g_psInfo,(int)nScanline,(unsigned char *)pabyScanLineBuf);
234
235
  //-----------------------------------------------------------------------
236
  //Obtenemos el valor de retorno
237
  //-----------------------------------------------------------------------
238
239
240
  id_campo = (*env)->GetFieldID(env, class_buf, "pabyScanLineBuf", "[B");
241
  pabySLB = (*env)->NewByteArray(env,g_psInfo->nXSize);
242
  if(pabySLB!=NULL){
243
          (*env)->SetByteArrayRegion(env, pabySLB, 0, g_psInfo->nXSize,(jbyte *)pabyScanLineBuf);
244
          (*env)->SetObjectField(env, buf, id_campo, pabySLB);
245
  }
246
247
  //-----------------------------------------------------------------------
248
  //Liberamos la memoria de la linea le?da
249
  //-----------------------------------------------------------------------
250
251
  if(pabyScanLineBuf != NULL)free(pabyScanLineBuf);
252
253
254
255
  return result;
256
257
}
258
259
260
261
262
/****************************************************************/
263
//Libera recursos y memoria
264
265 791 igbrotru
JNIEXPORT void JNICALL Java_es_gva_cit_jbsb_Bsb_bsbCloseNat
266 716 igbrotru
  (JNIEnv *env, jobject obj, jlong cPtr)
267
{
268
        g_psInfo  = (BSBInfo *) 0 ;
269
270
    g_psInfo = *(BSBInfo **)&cPtr;
271
        BSBClose(g_psInfo);
272
273
274
}