GDAL通过swig,在.net和java下使用注意事项.

如果对gdal和swig不熟悉,请参阅http://www.cnblogs.com/zhangjun1130/archive/2009/11/13/1602340.html,讲得非常详细.

现就在使用过程中遇到的一些问题做下说明.

一:在.net中应用

在.net中使用问题不是很大,但需要注意,在编译的时候,最好不要使用静态链接,即(\gdal-1.7.0b1\swig\csharp\csharp.opt中把CSHARP_STATIC_LINKAGE注释掉或者设置为no,因为如果CSHARP_STATIC_LINKAGE设置为yes,会带来莫名其妙的问题,比如 Gdal.SetConfigOption不能用,这项不能用会带来非常严重的问题,如日志看不了,GDAL_DATA不能用等等....总之,如果CSHARP_STATIC_LINKAGE设置为yes,会带来灾难性的问题.

 

二:在java中应用

在java中使用问题相对来说比较多.除了上面.net中一样的问题外,另外还有jni的问题.原因就是Java与C之间通过JNI传递中文字符串会出现不可逆转的乱码.导致中文环境下问题一堆堆的.

解决的方法是修改jni.h(jni.h在jdk安装目录下的include中)

另外在编译swig过程中,如果把jdk安装在中文路径或者带空格的路径中,会出现莫名其妙的问题,解决的方法就是把jdk安装目录下的整个文件夹拷贝的比如c盘根目录下.

打开jni.h

找到

    jstring NewStringUTF(const char *utf) {
        return functions->NewStringUTF(this,utf);
    }

修改为:

    jstring NewStringUTF(const char *utf) {
  jstring rtn = 0;
  int slen = strlen(utf);
  unsigned short * buffer = 0;
  if( slen == 0 )
   rtn = functions->NewStringUTF(this,utf );
  else
  {
   int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)utf, slen, NULL, 0 );
   buffer = (unsigned short *)malloc( length*2 + 1 );
   if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)utf, slen, (LPWSTR)buffer, length ) >0 )
    rtn = functions->NewString(  (jchar*)buffer, length );
  }
  if( buffer )
   free( buffer );
  return rtn;
 }

 

找到

    const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
        return functions->GetStringUTFChars(this,str,isCopy);
    }

修改为:

    const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
  int length = functions->GetStringLength(this,str );
  const jchar* jcstr = functions->GetStringChars(this,str, isCopy );
  char* rtn = (char*)malloc( length*2+1 );
  int size = 0;
  size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
  if( size <= 0 )
   return NULL;
  functions->ReleaseStringChars(this,str, jcstr );
  rtn[size] = 0;
  return rtn;
 }

 

 

另附自动编译生成.net和java下的dll的脚本autoBuliding.bat,具体内容如下(具体的文件位置请自行修改,我的在F:\Study\GDAL\gdal170b1\gdal-1.7.0b1):

F:

cd F:\Study\GDAL\gdal170b1\gdal-1.7.0b1

nmake /f makefile vc clean

nmake /f makefile vc

nmake /f makefile vc install

nmake /f makefile vc staticlib

nmake /f makefile vc devinstall

cd swig

cd csharp

nmake /f makefile vc clean

cd ..

nmake /f makefile vc csharp

cd csharp

nmake /f makefile vc instal

cd ..

cd java

nmake /f makefile vc clean

cd ..

nmake /f makefile vc java

cd java

mt.exe -manifest orgjni.dll.manifest -outputresource:ogrjni.dll;2

mt.exe -manifest gdaljni.dll.manifest -outputresource:gdaljni.dll;2

mt.exe -manifest gdalconstni.dll.manifest -outputresource:gdalconstjni.dll;2

mt.exe -manifest osrjni.dll.manifest -outputresource:osrjni.dll;2

nmake /f makefile vc install

 

 

使用方法,打开vs2005/2008的“Visual Studio 2005 命令提示”工具,(该工具位于“开始\程序\Microsoft Visual Studio 2005\Visual Studio Tools”内)。,

执行脚本.

 

 

 

 

posted on 2010-01-10 17:53  huihui-热带鱼  阅读(1572)  评论(0编辑  收藏  举报