root / trunk / libraries / libjni-gdal-macosx / src / bsb_interfaz.c @ 31538
History | View | Annotate | Download (9.38 KB)
1 | 8219 | nacho | /**********************************************************************
|
---|---|---|---|
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 | /* 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 | } |