Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libjni-gdal-macosx / src / bsb_interfaz.c @ 25798

History | View | Annotate | Download (9.38 KB)

1
/**********************************************************************
2
 * $Id: bsb_interfaz.c 8219 2006-10-23 06:25:39Z nacho $
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
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
12
*
13
* Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License
17
* as published by the Free Software Foundation; either version 2
18
* of the License, or (at your option) any later version.
19
*
20
* This program is distributed in the hope that it will be useful,
21
* but WITHOUT ANY WARRANTY; without even the implied warranty of
22
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
* GNU General Public License for more details.
24
*
25
* You should have received a copy of the GNU General Public License
26
* along with this program; if not, write to the Free Software
27
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
28
*
29
* For more information, contact:
30
*
31
*  Generalitat Valenciana
32
*   Conselleria d'Infraestructures i Transport
33
*   Av. Blasco Ib??ez, 50
34
*   46010 VALENCIA
35
*   SPAIN
36
*
37
*      +34 963862235
38
*   gvsig@gva.es
39
*      www.gvsig.gva.es
40
*
41
*    or
42
*
43
*   IVER T.I. S.A
44
*   Salamanca 50
45
*   46005 Valencia
46
*   Spain
47
*
48
*   +34 963163400
49
*   dac@iver.es
50
*/
51

    
52
#include <jni.h>
53
#include "es_gva_cit_jbsb_Bsb.h"
54
#include "bsb_read.h"
55

    
56

    
57
int tam;
58
BSBInfo *g_psInfo;
59

    
60

    
61
/****************************************************************/
62
/*Carga un objeto jobject a partir de una estructura BSBInfo*/
63

    
64

    
65
jobject cargarJobject(JNIEnv *env, BSBInfo *psInfo, jobject *ref){
66
        
67
   jclass class_bsbinfo; 
68
   jfieldID id_campo; 
69
   jobject obj_bsbinfo;
70
   jmethodID metodo;
71
   jshortArray jvect_short, array_strings;
72
   jintArray jvect_int;
73
   jshort *vect_short;
74
   jint *vect_int;
75
   jclass class_string;
76
   int i;
77
   int nitems_header;                //tama? de memoria reservada en papszHeader
78
   int cont_arrays;                        //Numero de arrays en papszHeader
79
   jlong jresult=0;
80
   
81
   //Obtenemos la direccion del BSBInfo
82
   
83
   *(BSBInfo **)&jresult = g_psInfo;
84
   
85
   //Calculamos el numero de bytes reservados del campo papszHeader
86
  
87
   cont_arrays=0; 
88
   nitems_header=0;
89
   while(psInfo->papszHeader[cont_arrays]!=NULL){
90
    //printf("%s %d\n",psInfo->papszHeader[cont_arrays],cont_arrays);
91
    nitems_header+=strlen(psInfo->papszHeader[cont_arrays]);
92
    cont_arrays++;
93
   } 
94
    //printf("%d %d\n",cont_arrays,sizeof(nitems_header));   
95
    
96
   //obtenemos la clase BSBInfo y creamos un objeto de este tipo
97
   
98
   if(ref==NULL){
99
           
100
           class_bsbinfo = (*env)->FindClass (env, "es/gva/cit/jbsb/BsbInfo");
101
           metodo = (*env)->GetMethodID(env, class_bsbinfo, "reserva", "(III)V");
102
           obj_bsbinfo = (*env)->NewObject (env,class_bsbinfo,metodo,psInfo->nPCTSize*3,cont_arrays/*sizeof(nitems_header)*/,psInfo->nYSize);
103
   
104
   
105
    if(obj_bsbinfo!=NULL){
106
                       
107
            
108
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nXSize", "I");
109
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nXSize); 
110
            
111
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nYSize", "I");
112
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nYSize); 
113
            
114
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nPCTSize", "I");
115
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nPCTSize); 
116
            
117
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "cPtr", "J");
118
             (*env)->SetLongField(env, obj_bsbinfo, id_campo, jresult);
119
            
120
      //-----------------------------------------------------------------------
121
          //CARGAMOS EL CAMPO DE JOBJECT pabyPCT
122
          //-----------------------------------------------------------------------
123
            
124
             //printf("pabyPCT %d",psInfo->nPCTSize);
125
             
126
             vect_short = (jshort *) calloc(sizeof(jchar),(psInfo->nPCTSize*3));
127
             for(i=0;i<(psInfo->nPCTSize*3);i++){
128
                    vect_short[i]=(jchar)(psInfo->pabyPCT[i]);
129
             }
130
             jvect_short = (*env)->NewShortArray(env, psInfo->nPCTSize*3);
131
             if(jvect_short!=NULL){
132
               (*env)->SetShortArrayRegion(env, jvect_short, 0, psInfo->nPCTSize*3,(jshort *)vect_short); 
133
               id_campo = (*env)->GetFieldID(env, class_bsbinfo, "pabyPCT", "[S");
134
               (*env)->SetObjectField(env, obj_bsbinfo, id_campo, jvect_short);
135
               free(vect_short); 
136
             }else{
137
                             free(vect_short);
138
                             return NULL;
139
             }
140
            
141
            
142
            
143
             //printf("tama? papszHeader %d",nitems_header);
144
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "papszHeader", "[Ljava/lang/String;");
145
             class_string = (*env)->FindClass (env, "java/lang/String");
146
             array_strings=(*env)->NewObjectArray(env, cont_arrays, class_string, (*env)->NewStringUTF(env,""));           
147
             if(array_strings!=NULL){
148
                    
149
                     for(i=0;i<cont_arrays;i++)                            
150
                        (*env)->SetObjectArrayElement(env,array_strings,i,(*env)->NewStringUTF(env,psInfo->papszHeader[i]));
151
                    
152
                    (*env)->SetObjectField(env, obj_bsbinfo, id_campo, array_strings); 
153
                    
154
             }else return NULL;
155
            
156
            
157
             //printf("tama? panLineOffset %d",sizeof(*psInfo->panLineOffset));
158
             vect_int = (jint *) calloc(sizeof(jint),psInfo->nYSize);
159
             for(i=0;i< psInfo->nYSize;i++){
160
                    vect_int[i]=(jint)(psInfo->panLineOffset[i]);
161
             }
162
             jvect_int = (*env)->NewIntArray(env, psInfo->nYSize);
163
             if(jvect_int!=NULL){
164
               (*env)->SetIntArrayRegion(env, jvect_int, 0, psInfo->nYSize,vect_int); 
165
               id_campo = (*env)->GetFieldID(env, class_bsbinfo, "panLineOffset", "[I");
166
               (*env)->SetObjectField(env, obj_bsbinfo, id_campo, jvect_int);
167
               free(vect_int); 
168
             }else{
169
                             free(vect_int);
170
                            return NULL;
171
             }
172
            
173
            
174
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nColorSize", "I");
175
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nColorSize); 
176
            
177
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nVersion", "I");
178
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nVersion); 
179
            
180
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "bNO1", "I");
181
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->bNO1); 
182
            
183
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "bNewFile", "I");
184
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->bNewFile); 
185
            
186
             id_campo = (*env)->GetFieldID(env, class_bsbinfo, "nLastLineWritten", "I");
187
             (*env)->SetIntField(env, obj_bsbinfo, id_campo, psInfo->nLastLineWritten); 
188
            
189
    }else return NULL;
190
   
191
   
192
    return obj_bsbinfo;
193
   }else{
194
           
195
             return NULL;
196
   }
197
}
198

    
199

    
200
/****************************************************************/
201
/*Llamada a la funci? BSBOpen de bsb_read.c. Convierte los par?tros que viene de java
202
 * , llama a la funci? y construye el objeto para devolver el resultado*/
203

    
204

    
205
JNIEXPORT jobject JNICALL Java_es_gva_cit_jbsb_Bsb_bsbOpenNat(JNIEnv *env, 
206
                                                                                                                        jobject obj, 
207
                                                                                                                        jstring pszF)
208
{
209
  
210
  
211
  const char *pszFilename = (*env)->GetStringUTFChars(env, pszF, 0);        
212
 
213
          
214
  g_psInfo = BSBOpen(pszFilename);
215
  
216
  (*env)->ReleaseStringUTFChars(env, pszF, pszFilename);
217

    
218
  return cargarJobject(env,g_psInfo,NULL);
219
  
220
}
221

    
222

    
223

    
224
/****************************************************************/
225
//Funci?n que encapsula a BSBReadLine cd bsb_read.c. Convierte los par?metros que viene de 
226
// java y llama a la funci?n cd C que lee una linea.
227

    
228

    
229
JNIEXPORT jint JNICALL Java_es_gva_cit_jbsb_Bsb_bsbReadLineNat(        JNIEnv *env, 
230
                                                                                                                                        jobject obj,
231
                                                                                                                                        jlong cPtr,
232
                                                                                                                                        jobject buf,
233
                                                                                                                                        jint nScanline,
234
                                                                                                                                        jstring pszF)
235
{
236
    
237
  int result;
238
  jfieldID id_campo;
239
  jclass class_buf;
240
  jbyteArray pabySLB;
241
  unsigned char *pabyScanLineBuf;
242
  
243
  g_psInfo  = (BSBInfo *) 0 ; 
244
  g_psInfo = *(BSBInfo **)&cPtr;
245
  
246
  
247
  pabyScanLineBuf = (unsigned char *) malloc(g_psInfo->nXSize);
248
  class_buf = (*env)->GetObjectClass(env, buf); 
249
  
250
            
251

    
252
  //-----------------------------------------------------------------------
253
  //Llamamos a la funci?n de libreria que lee una l?nea y la cargamos sobre
254
  //pabyScanLineBuf  
255
  //-----------------------------------------------------------------------
256
  
257
  result = BSBReadScanline(g_psInfo,(int)nScanline,(unsigned char *)pabyScanLineBuf);
258

    
259
  //-----------------------------------------------------------------------
260
  //Obtenemos el valor de retorno 
261
  //-----------------------------------------------------------------------   
262
  
263
  
264
  id_campo = (*env)->GetFieldID(env, class_buf, "pabyScanLineBuf", "[B");
265
  pabySLB = (*env)->NewByteArray(env,g_psInfo->nXSize);
266
  if(pabySLB!=NULL){
267
          (*env)->SetByteArrayRegion(env, pabySLB, 0, g_psInfo->nXSize,(jbyte *)pabyScanLineBuf); 
268
          (*env)->SetObjectField(env, buf, id_campo, pabySLB);
269
  }
270

    
271
  //-----------------------------------------------------------------------
272
  //Liberamos la memoria de la linea le?da 
273
  //-----------------------------------------------------------------------
274
    
275
  if(pabyScanLineBuf != NULL)free(pabyScanLineBuf);
276
  
277

    
278
  
279
  return result;
280
 
281
}
282

    
283

    
284

    
285

    
286
/****************************************************************/
287
//Libera recursos y memoria
288

    
289
JNIEXPORT void JNICALL Java_es_gva_cit_jbsb_Bsb_bsbCloseNat
290
  (JNIEnv *env, jobject obj, jlong cPtr)
291
{
292
        g_psInfo  = (BSBInfo *) 0 ;
293
        
294
    g_psInfo = *(BSBInfo **)&cPtr;
295
        BSBClose(g_psInfo);
296
        
297
        
298
}
299