If you try to write you own JRDataSourceProvider you got a NPE Reports using Crosstabs.
From Jasper Report 3.7.1 there is a method ReportQueryDialog::jButton2ActionPerformed(java.awt.event.ActionEvent evt)
Inside that method net.sf.jasperreports.engine.JasperReport jr = new net.sf.jasperreports.engine.JasperReport(report,"",null,null,"");
ist called. And here is the JRExpressionCollector initialised with null!
this variable is used inside JRBaseObjectFactory::visitCrosstab(JRCrosstab crosstab)
here it is also null and the variable not checked to null.
Then you got the NPE