void statically()
{
   std::cout << "statically" << std::endl;
   
   // Create a c++ proxy on an java Allocation object instance
   Allocation A;
   // Create another c++ proxy on the same java Allocation object instance
   Allocation Acopy(A);
   // Create another c++ proxy on the same java Allocation object instance
   Allocation Acopy2(A.getJavaObject());
   // Create a c++ proxy on another java Allocation object instance
   Allocation Aclone = A.clone();
   
   std::cout << "Allocation: ";
   assertThat(A.getValue()).isEqualTo(-1);
   assertThat(Acopy.getValue()).isEqualTo(-1);
   assertThat(Acopy2.getValue()).isEqualTo(-1);
   assertThat(Aclone.getValue()).isEqualTo(-1);
   std::cout << "ok" << std::endl;
   
   A.setValue(2);
   std::cout << "A.setValue(2): ";
   assertThat(A.getValue()).isEqualTo(2);
   assertThat(Acopy.getValue()).isEqualTo(2);
   assertThat(Acopy2.getValue()).isEqualTo(2);
   assertThat(Aclone.getValue()).isEqualTo(-1);
   std::cout << "ok" << std::endl;

   Aclone.setValue(3);
   std::cout << "Aclone.setValue(3): ";
   assertThat(A.getValue()).isEqualTo(2);
   assertThat(Acopy.getValue()).isEqualTo(2);
   assertThat(Acopy2.getValue()).isEqualTo(2);
   assertThat(Aclone.getValue()).isEqualTo(3);
   std::cout << "ok" << std::endl;

   Acopy.setValue(4);
   std::cout << "Acopy.setValue(4): ";
   assertThat(A.getValue()).isEqualTo(4);
   assertThat(Acopy.getValue()).isEqualTo(4);
   assertThat(Acopy2.getValue()).isEqualTo(4);
   assertThat(Aclone.getValue()).isEqualTo(3);
   std::cout << "ok" << std::endl;
}