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”内)。,
执行脚本.