[jnigen] Fix getID bug (#1029)

jniEnv could be null before calling attachThread, even for getting the function pointer.
diff --git a/pkgs/jni/CHANGELOG.md b/pkgs/jni/CHANGELOG.md
index 9eef5f3..650f98d 100644
--- a/pkgs/jni/CHANGELOG.md
+++ b/pkgs/jni/CHANGELOG.md
@@ -46,6 +46,11 @@
 - `JObject`s now check the types using `instanceof` in debug mode when using
   `castTo`.
 
+## 0.7.3
+
+- Fixed a bug where `get(Static)MethodID` and `get(Static)FieldID` could access
+  null and throw.
+
 ## 0.7.2
 
 - Fixed a bug where reading non-null terminated strings would overflow.
diff --git a/pkgs/jni/src/dartjni.c b/pkgs/jni/src/dartjni.c
index baef731..382c9bc 100644
--- a/pkgs/jni/src/dartjni.c
+++ b/pkgs/jni/src/dartjni.c
@@ -211,25 +211,28 @@
                                       char* name,
                                       char* sig) {
   JniPointerResult result = {NULL, NULL};
-  attach_thread();
   result.value = getter(jniEnv, cls, name, sig);
   result.exception = check_exception();
   return result;
 }
 
 JniPointerResult getMethodID(jclass cls, char* name, char* sig) {
+  attach_thread();
   return _getId((MemberGetter)(*jniEnv)->GetMethodID, cls, name, sig);
 }
 
 JniPointerResult getStaticMethodID(jclass cls, char* name, char* sig) {
+  attach_thread();
   return _getId((MemberGetter)(*jniEnv)->GetStaticMethodID, cls, name, sig);
 }
 
 JniPointerResult getFieldID(jclass cls, char* name, char* sig) {
+  attach_thread();
   return _getId((MemberGetter)(*jniEnv)->GetFieldID, cls, name, sig);
 }
 
 JniPointerResult getStaticFieldID(jclass cls, char* name, char* sig) {
+  attach_thread();
   return _getId((MemberGetter)(*jniEnv)->GetStaticFieldID, cls, name, sig);
 }