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 | } |