首页 / 浏览问题 / 组件GIS / 问题详情
官网下载的java代码运行出错
16EXP 2017年03月03日
下载的iObjects Java组件,将路径添加到path路径中,然后在eclipse中启动官网下载的editData代码时报错,提示说java.lang.UnsatisfiedLinkError: WrapjGeo.dll 动态链接库(DLL)初始化例程失败。

1个回答

1.首先检查iobjects java组件bin目录下是否有WrapjGeo.dll文件存在,不存在重新下载完整包。

2.若存在,如果系统是64位的,请检查path变量的添加的是否是bin_x64的目录,32位的请添加bin目录。

3.确保工程引用包路径与path变量里的路径一致,并确保引用了工程所需的所有jar包。
1,520EXP 2017年03月03日

1.WrapjGeo.dll文件存在

2.我下载的是这个压缩包 SMO_Java_810_14127_58257_64_x64_win_vc11_Bin 系统是64位的,bin_x64的目录是指哪个bin目录?

3.这个工程只引用了com.supermap.data 这个jar包,而且路径是一致的。

如果解压后有bin和bin_x64两个目录就把x64这个目录添加到path,如果只有bin目录就把bin添加到path,工程里引用所有的jar包,确保jar包的依赖关系完整。
我这个包解压后只有bin这个目录,在官网下载的代码里面也只有com.supermap.data这个包的引用,我不清楚还有什么依赖包,你知道IObject java有没有相关的开发文档可供参考。
有可能是这个data包与你path里bin目录下的data包版本不一致导致,把这个data包移除掉,然后给工程添加bin目录下的所有jar包,重新编译

package test.supermap;

import com.supermap.data.Datasource;
import com.supermap.data.Workspace;
import com.supermap.data.*;

public class EditData {
    
    
private static Datasource datasource;
    
    public static void main(String[] args) {
        
//        System.setProperties("D:/tools/SuperMap/Bin");
        System.out.println(System.getProperty("java.library.path"));  
        
        // 打开数据源
        Workspace workspace = new Workspace();
        DatasourceConnectionInfo info = new DatasourceConnectionInfo();
        info.setServer("C:/Users/admin/Desktop/supermap for java/editData/testData/test.udb");
        info.setEngineType(EngineType.UDB);
        datasource = workspace.getDatasources().open(info);
        if (datasource!=null) {
            //从后台传过来的点要存储在点数据集中,如果没有对应的点数据集,创建一个点数据集,其坐标系和数据源的坐标系一致
            createDataset();
        }
    }
    
    private static void createDataset(){
        DatasetVectorInfo dvinfo = new DatasetVectorInfo();
        dvinfo.setType(DatasetType.POINT);
        dvinfo.setName("test_point");
        DatasetVector datasetpoint = datasource.getDatasets().create(dvinfo);
        if (datasetpoint!=null) {
            System.out.println("点数据集创建成功!!");
            //向创建的数据集中添加点对象,这个点对象可以是后台传过来的
            addPoint(datasetpoint);
        }
    }
    
    private static void addPoint(DatasetVector point){
        //添加5个点,点的来源可以不同,这里随意构建了5个点
        Point2D point2d1 = new Point2D(1,2);
        Point2D point2d2 = new Point2D(3,2);
        Point2D point2d3 = new Point2D(4,5);
        Point2D point2d4 = new Point2D(3,6);
        Point2D point2d5 = new Point2D(6,6);
        Point2Ds point2Ds = new Point2Ds();
        point2Ds.add(point2d1);
        point2Ds.add(point2d2);
        point2Ds.add(point2d3);
        point2Ds.add(point2d4);
        point2Ds.add(point2d5);
        Recordset recordset = point.getRecordset(false, CursorType.DYNAMIC);
        recordset.moveFirst();
        for (int i = 0; i < point2Ds.getCount(); i++) {
            GeoPoint geoPoint = new GeoPoint(point2Ds.getItem(i));
            recordset.addNew(geoPoint);    
            recordset.update();
        }    
        System.out.println(recordset.getRecordCount());
        //添加一个自定义字段
        addFieldinfo(point);
    }

    private static void addFieldinfo(DatasetVector point){
        FieldInfo fieldinfo = new FieldInfo();
        fieldinfo.setName("name");
        fieldinfo.setType(FieldType.TEXT);
        fieldinfo.setRequired(true);
        fieldinfo.setCaption("testname");
        fieldinfo.setDefaultValue("测试");
        FieldInfos fieldInfos = point.getFieldInfos();
        int count = fieldInfos.getCount();
        fieldInfos.add(fieldinfo);
        Recordset recordset = point.getRecordset(false, CursorType.DYNAMIC);
        if (fieldInfos.get(count).getName().equals("name")) {
            System.out.println("自定义字段创建成功!!");
            //修改字段值
            editField(recordset);
        }
    }
    
    private static void editField(Recordset recordset){
        recordset.moveFirst();
        while (!recordset.isEOF()) {
            recordset.edit();    
            recordset.setFieldValue("name", "超图");
            recordset.update();
            recordset.moveNext();
        }
        //用完recordset,关闭并释放
        recordset.close();
        recordset.dispose();
    }

}

这是我的代码,而且我电脑上也只有这一个版本的bin目录,所以不会存在版本不一致的情况,你知道IObject java有没有相关的开发文档可供参考。

解压版的没有文档,下载完整版的里面有联机帮助文档,文档好几百M,如果是刚入门,建议下载完整版。
哦,那你感觉我的代码部分有没有问题

 recordset.moveFirst();
        for (int i = 0; i < point2Ds.getCount(); i++) {
            GeoPoint geoPoint = new GeoPoint(point2Ds.getItem(i));
            recordset.addNew(geoPoint);    
            recordset.update();
        }    

这段代码有点小问题,recordset.update();可以现在循环外部,另外对于批量添加记录和字段可用这个类Recordset.BatchEditor,效率更高,具体实现建议查看联机帮助文档的示例代码。

好的,多谢
我发现了,bin文件夹的路径在path中放在jdk的路径后面就好了
...