Hi Rooters! I want to use ROOT classes from a java program, with "native" calls to C++. I could do this in some simple applications, but now i have a problem. I'm not albe to write to a file. I've copied a ROOT tutorial, which is a macro, in my native function with very few changes. The runtime error i get shouldn't be a consequence of Java stuff, but probably it is: doing the same things in a C++ main() everything is fine. The error is: TFile Writing Name=hsimple.root Title= CustomReAlloc2: oldsize != size Fatal in <CustomReAlloc2>: unreasonable size (1169) aborting *** Error code 134 (bu21) Java source: public class First { public native void callRoot(); static { System.loadLibrary("first"); } public static void main(String[] args) { new First().callRoot(); } } C++ source: #include "TROOT.h" #include "TObject.h" #include "TApplication.h" #include "TCanvas.h" #include "TLine.h" #include "TPaveLabel.h" #include "TFile.h" #include "TH1.h" #include "TH2.h" #include "TProfile.h" #include "TNtuple.h" #include "TRandom.h" #include "First.h" #include "stdio.h" #include "stdlib.h" extern void InitGui(); VoidFuncPtr_t initfuncs[] = { InitGui, 0 }; int Error; // needed by Motif TROOT root("prova","Prova", initfuncs); void Java_First_callRoot(JNIEnv *env, jobject obj) { int * argc= new int; *argc=1; char** argv=new char*; *argv="app"; TApplication theApp("App",argc,argv); TCanvas *c1 = new TCanvas("c1","Dynamic Filling Example",200,10,700,500); c1->SetFillColor(42); c1->GetFrame()->SetFillColor(21); c1->GetFrame()->SetBorderSize(6); c1->GetFrame()->SetBorderMode(-1); TFile* hfile = new TFile("hsimple.root","RECREATE"); // Create some histograms, a profile histogram and an ntuple TH1F *hpx = new TH1F("hpx","This is the px distribution",50,-4,4); TH2F *hpxpy = new TH2F("hpxpy","py vs px",40,-4,4,40,-4,4); TProfile *hprof = new TProfile("hprof","Profile of pz versus px",100,-4,4,0,20); TNtuple *ntuple = new TNtuple("ntuple","Demo ntuple","px:py:pz:random:i"); // Set canvas/frame attributes (save old attributes) hpx->SetFillColor(48); // Fill histograms randomly gRandom->SetSeed(); Float_t px, py, pz; const Int_t kUPDATE = 1000; for ( Int_t i=0; i<25000; i++) { gRandom->Rannor(px,py); pz = px*px + py*py; Float_t random = gRandom->Rndm(1); hpx->Fill(px); hpxpy->Fill(px,py); hprof->Fill(px,pz); ntuple->Fill(px,py,pz,random,i); if (!i%kUPDATE) { if (i == kUPDATE) hpx->Draw(); c1->Modified(); c1->Update(); } } // Save all objects in this file hpx->SetFillColor(0); hfile->Write(); hpx->SetFillColor(48); theApp.Run(); return; }
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:37 MET