title: Invalid JNI reference (calling Java method from c++)
body: <p>I'm having a problem with a call to enable the GPS localization from c++. I generated the JNI wrappers with SWIG. The logcat says :</p>
  
  <pre><code>01-02 17:14:03.816: D/dalvikvm(6165): Trying to load lib /data/data/com.example.swig/lib/libcppinterface.so 0x44e7ebf0
  01-02 17:14:03.976: D/dalvikvm(6165): Added shared lib /data/data/com.example.swig/lib/libcppinterface.so 0x44e7ebf0
  01-02 17:14:04.886: W/dalvikvm(6165): JNI WARNING: 0x44e8bb48 is not a valid JNI reference
  01-02 17:14:04.886: W/dalvikvm(6165):              in Lcom/example/swig/cpplib/cppinterfaceJNI;.LocationSpotter_refresh (JLcom/example/swig/cpplib/LocationSpotter;)V (CallVoidMethodV)
  01-02 17:14:04.886: I/dalvikvm(6165): "main" prio=5 tid=1 RUNNABLE
  01-02 17:14:04.886: I/dalvikvm(6165):   | group="main" sCount=0 dsCount=0 s=N obj=0x4001d8e0 self=0xccb0
  01-02 17:14:04.886: I/dalvikvm(6165):   | sysTid=6165 nice=0 sched=0/0 cgrp=default handle=-1345026008
  01-02 17:14:04.886: I/dalvikvm(6165):   | schedstat=( 226108400 549900071 66 )
  01-02 17:14:04.886: I/dalvikvm(6165):   at com.example.swig.cpplib.cppinterfaceJNI.LocationSpotter_refresh(Native Method)
  01-02 17:14:04.896: I/dalvikvm(6165):   at com.example.swig.cpplib.LocationSpotter.refresh(LocationSpotter.java:56)
  01-02 17:14:04.896: I/dalvikvm(6165):   at com.example.swig.MainActivity.onCreate(MainActivity.java:50)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.ActivityThread.access$2300(ActivityThread.java:125)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.os.Handler.dispatchMessage(Handler.java:99)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.os.Looper.loop(Looper.java:123)
  01-02 17:14:04.896: I/dalvikvm(6165):   at android.app.ActivityThread.main(ActivityThread.java:4627)
  01-02 17:14:04.896: I/dalvikvm(6165):   at java.lang.reflect.Method.invokeNative(Native Method)
  01-02 17:14:04.896: I/dalvikvm(6165):   at java.lang.reflect.Method.invoke(Method.java:521)
  01-02 17:14:04.896: I/dalvikvm(6165):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
  01-02 17:14:04.896: I/dalvikvm(6165):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
  01-02 17:14:04.896: I/dalvikvm(6165):   at dalvik.system.NativeStart.main(Native Method)
  01-02 17:14:04.906: E/dalvikvm(6165): VM aborting
  </code></pre>
  
  <p>I trigger the call from Java with this line :</p>
  
  <pre><code>LocationSpotter.getLocationSpotter().refresh();
  </code></pre>
  
  <p>getLocationSpotter() triggers in c++ this code which creates a jobject (jSpotter) :</p>
  
  <pre><code>// Retrieve the current JNIEnv* with the cached JVM
  JNIEnv* env;
  AndroidLocationSpotter::cachedJVM-&gt;AttachCurrentThread(&amp;env, NULL);
  
  jclass clazz = env-&gt;FindClass("com/example/swig/AndroidLocationSpotter");
  jmethodID construct = env-&gt;GetMethodID(clazz, "&lt;init&gt;", "()V");
  
  jSpotter = env-&gt;NewObject(clazz, construct);
  </code></pre>
  
  <p>and after the method refresh() triggers this code which makes the application crash :</p>
  
  <pre><code>// Retrieve the current JNIEnv* with the cached JVM
  JNIEnv* env;
  AndroidLocationSpotter::cachedJVM-&gt;AttachCurrentThread(&amp;env, NULL);
  
  jclass clazz = env-&gt;FindClass("com/example/swig/AndroidLocationSpotter");
  jmethodID refresh = env-&gt;GetMethodID(clazz, "refresh", "()V");
  
  env-&gt;CallVoidMethod(jSpotter, refresh); // The line where the crash happens
  </code></pre>
  
  <p>I also need to mention that I initiate "cachedJVM" in the JNI_OnLoad function. Hope someone could help me on this, thanks</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>Working code :</p>
  
  <pre><code>// Retrieve the current JNIEnv* with the cached JVM
  JNIEnv* env;
  AndroidLocationSpotter::cachedJVM-&gt;AttachCurrentThread(&amp;env, NULL);
  
  jclass clazz = env-&gt;FindClass("com/example/swig/AndroidLocationSpotter");
  jmethodID construct = env-&gt;GetMethodID(clazz, "&lt;init&gt;", "()V");
  
  jSpotter = env-&gt;NewObject(clazz, construct);
  
  jSpotter = env-&gt;NewGlobalRef(jSpotter);
  </code></pre>