diff options
Diffstat (limited to 'JNIHelp.cpp')
-rw-r--r-- | JNIHelp.cpp | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/JNIHelp.cpp b/JNIHelp.cpp index 041776c..bc0b49c 100644 --- a/JNIHelp.cpp +++ b/JNIHelp.cpp @@ -72,13 +72,15 @@ extern "C" int jniRegisterNativeMethods(C_JNIEnv* env, const char* className, scoped_local_ref<jclass> c(env, findClass(env, className)); if (c.get() == NULL) { - ALOGE("Native registration unable to find class '%s', aborting", className); - abort(); + char* msg; + asprintf(&msg, "Native registration unable to find class '%s', aborting", className); + e->FatalError(msg); } if ((*env)->RegisterNatives(e, c.get(), gMethods, numMethods) < 0) { - ALOGE("RegisterNatives failed for '%s', aborting", className); - abort(); + char* msg; + asprintf(&msg, "RegisterNatives failed for '%s', aborting", className); + e->FatalError(msg); } return 0; @@ -304,11 +306,15 @@ const char* jniStrError(int errnum, char* buf, size_t buflen) { } } -static struct CachedFields { - jclass fileDescriptorClass; - jmethodID fileDescriptorCtor; - jfieldID descriptorField; -} gCachedFields; +static struct { + jclass clazz; + jmethodID ctor; + jfieldID descriptor; +} gFileDescriptorClassInfo; + +static struct { + jmethodID get; +} gReferenceClassInfo; jint JNI_OnLoad(JavaVM* vm, void*) { JNIEnv* env; @@ -317,21 +323,31 @@ jint JNI_OnLoad(JavaVM* vm, void*) { abort(); } - gCachedFields.fileDescriptorClass = + gFileDescriptorClassInfo.clazz = reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/io/FileDescriptor"))); - if (gCachedFields.fileDescriptorClass == NULL) { + if (gFileDescriptorClassInfo.clazz == NULL) { + abort(); + } + + gFileDescriptorClassInfo.ctor = + env->GetMethodID(gFileDescriptorClassInfo.clazz, "<init>", "()V"); + if (gFileDescriptorClassInfo.ctor == NULL) { abort(); } - gCachedFields.fileDescriptorCtor = - env->GetMethodID(gCachedFields.fileDescriptorClass, "<init>", "()V"); - if (gCachedFields.fileDescriptorCtor == NULL) { + gFileDescriptorClassInfo.descriptor = + env->GetFieldID(gFileDescriptorClassInfo.clazz, "descriptor", "I"); + if (gFileDescriptorClassInfo.descriptor == NULL) { abort(); } - gCachedFields.descriptorField = - env->GetFieldID(gCachedFields.fileDescriptorClass, "descriptor", "I"); - if (gCachedFields.descriptorField == NULL) { + jclass clazz = reinterpret_cast<jclass>(env->FindClass("java/lang/ref/Reference")); + if (clazz == NULL) { + abort(); + } + + gReferenceClassInfo.get = env->GetMethodID(clazz, "get", "()Ljava/lang/Object;"); + if (gReferenceClassInfo.get == NULL) { abort(); } @@ -341,19 +357,24 @@ jint JNI_OnLoad(JavaVM* vm, void*) { jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd) { JNIEnv* e = reinterpret_cast<JNIEnv*>(env); jobject fileDescriptor = (*env)->NewObject(e, - gCachedFields.fileDescriptorClass, gCachedFields.fileDescriptorCtor); + gFileDescriptorClassInfo.clazz, gFileDescriptorClassInfo.ctor); jniSetFileDescriptorOfFD(env, fileDescriptor, fd); return fileDescriptor; } int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor) { JNIEnv* e = reinterpret_cast<JNIEnv*>(env); - return (*env)->GetIntField(e, fileDescriptor, gCachedFields.descriptorField); + return (*env)->GetIntField(e, fileDescriptor, gFileDescriptorClassInfo.descriptor); } void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value) { JNIEnv* e = reinterpret_cast<JNIEnv*>(env); - (*env)->SetIntField(e, fileDescriptor, gCachedFields.descriptorField, value); + (*env)->SetIntField(e, fileDescriptor, gFileDescriptorClassInfo.descriptor, value); +} + +jobject jniGetReferent(C_JNIEnv* env, jobject ref) { + JNIEnv* e = reinterpret_cast<JNIEnv*>(env); + return (*env)->CallObjectMethod(e, ref, gReferenceClassInfo.get); } /* |