Search code examples
javaandroidgdalshapefile

Attempt to invoke virtual method 'int org.gdal.ogr.Layer.CreateField(org.gdal.ogr.FieldDefn)' on a null object reference


In Android, I use GDAL to export SQLite data to Shapefile format. But I get this Exception:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int org.gdal.ogr.Layer.CreateField(org.gdal.ogr.FieldDefn)' on a null object reference

my code:

    static {
        System.loadLibrary("gdaljni");
        System.loadLibrary("ogrjni");
        System.loadLibrary("osrjni");
    }

    public void WriteToShapeFile(Uri uri) throws FileNotFoundException {
        ogr.RegisterAll();
        ArrayList<ReportModel> cursor = databaseHelper.getReports();
        ArrayList<String> key_args = new ArrayList<>();
        key_args.add("id");
        key_args.add("name");
        key_args.add("geometry");
        key_args.add("type");
        Driver driver = ogr.GetDriverByName("ESRI Shapefile");
        final String fileName = "citizen_problems";
        //Saving file in external storage
        File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File(sdCard.getAbsolutePath() + "/citizen_problems/" + fileName);
        if (!directory.isDirectory()) {
            directory.mkdirs();
        }
        //file path
        File file = new File(directory, fileName);
        DataSource data_source = driver.CreateDataSource(file.getAbsolutePath());
        SpatialReference srs = new SpatialReference("");
        org.gdal.ogr.Layer layer_;
        layer_ = data_source.CreateLayer(fileName, srs, ogr.wkbPoint);
        for (String item : key_args) {
            FieldDefn field_name = new FieldDefn(item, ogr.OFTString);
            layer_.CreateField(field_name);
        }
        for (ReportModel row : cursor) {
            Feature feature = new Feature(layer_.GetLayerDefn());
            feature.SetField("id", row.getId());
            feature.SetField("name", row.getName());
            feature.SetField("type", row.getType());
            Geometry geom = null;
            try {
                String geo = row.getGeometry();
                if (geo != null) {
                    geom = ogr.CreateGeometryFromWkt(geo);
                    feature.SetGeometry(geom);
                }
            } catch (Exception e) {
            }
            layer_.CreateFeature(feature); 
        }
    }

CreateLayer() method returns null and I don't understand why.

layer_ = data_source.CreateLayer(fileName, srs, ogr.wkbPoint);

I have no idea about this problem. please help me


Solution

  • I changed mkdir() to mkdirs() and the problem was solved :)

    Final code is:

     public void WriteToShapeFile(Uri uri) {
        ogr.RegisterAll();
        ArrayList<ReportModel> data = databaseHelper.getReports();
        Driver driver = ogr.GetDriverByName("ESRI Shapefile");
        String fileName = "citizen_problems.shp";
        File directory = new File(getFilesDir(),  "/shapefiles/"+ fileName);
        if (!directory.isDirectory()) {
            directory.mkdirs();
        }
        File file = new File(directory, fileName);
    
        DataSource dataSource = driver.CreateDataSource(file.getAbsolutePath(),null);
        SpatialReference srs = new SpatialReference("");
        Layer layer = dataSource.CreateLayer(fileName, srs, ogr.wkbPoint,null);
        Layer l = dataSource.CreateLayer(fileName);
        Layer ll = dataSource.CreateLayer(fileName,srs,1,null);
    
        ArrayList<String> key_args = new ArrayList<>();
        key_args.add("id");
        key_args.add("name");
        key_args.add("type");
        key_args.add("geometry");
    
        for (String item : key_args) {
            layer.CreateField(new FieldDefn(item, ogr.OFTString));
        }
    
        for (ReportModel row : data) {
            Feature feature = new Feature(layer.GetLayerDefn());
            feature.SetField("id", row.getId());
            feature.SetField("name", row.getName());
            feature.SetField("type", row.getType());
            String geom = row.getGeometry();
            if (geom != null) {
                feature.SetGeometry(ogr.CreateGeometryFromWkt(geom));
            }
            layer.CreateFeature(feature);
            feature = null;
        }
        Utils.zipFileAtPath(getFilesDir() + "/shapefiles/"  + fileName, uri, this);
    }