OSDN Git Service

Lose libnativehelper to its own project for the PDK.
authorElliott Hughes <enh@google.com>
Fri, 4 May 2012 00:18:25 +0000 (17:18 -0700)
committerElliott Hughes <enh@google.com>
Fri, 4 May 2012 00:18:25 +0000 (17:18 -0700)
Bug: 6369821
Change-Id: Iae06cf1570a14ddefad6b31eec904d9fa598d89f

12 files changed:
Android.mk
dexopt/Android.mk
libnativehelper/Android.mk [deleted file]
libnativehelper/JNIHelp.cpp [deleted file]
libnativehelper/MODULE_LICENSE_APACHE2 [deleted file]
libnativehelper/NOTICE [deleted file]
libnativehelper/README [deleted file]
libnativehelper/Register.cpp [deleted file]
libnativehelper/include/nativehelper/JNIHelp.h [deleted file]
libnativehelper/include/nativehelper/jni.h [deleted file]
vm/Android.mk
vm/Init.cpp

index 8ab58e9..73ec342 100644 (file)
@@ -24,7 +24,6 @@ subdirs := $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
                dexdump \
                dvz \
                dx \
-               libnativehelper \
                tools \
                unit-tests \
        ))
index d4831d1..81fa1c8 100644 (file)
@@ -43,7 +43,7 @@ endif
 
 LOCAL_SRC_FILES := $(local_src_files)
 LOCAL_C_INCLUDES := $(local_c_includes)
-LOCAL_SHARED_LIBRARIES := $(local_shared_libraries) libcutils libexpat liblog libnativehelper libz
+LOCAL_SHARED_LIBRARIES := $(local_shared_libraries) libcutils libexpat liblog libz
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE := dexopt
 
@@ -57,7 +57,7 @@ ifeq ($(WITH_HOST_DALVIK),true)
     LOCAL_SRC_FILES := $(local_src_files)
     LOCAL_C_INCLUDES := $(local_c_includes)
     LOCAL_SHARED_LIBRARIES := $(local_shared_libraries)
-    LOCAL_STATIC_LIBRARIES :=  libcutils libexpat liblog libnativehelper libz
+    LOCAL_STATIC_LIBRARIES :=  libcutils libexpat liblog libz
     LOCAL_LDLIBS += -ldl -lpthread
     LOCAL_CFLAGS += -DANDROID_SMP=1
     LOCAL_MODULE_TAGS := optional
diff --git a/libnativehelper/Android.mk b/libnativehelper/Android.mk
deleted file mode 100644 (file)
index dea0907..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-# Copyright (C) 2009 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-LOCAL_PATH := $(call my-dir)
-
-#
-# Common definitions for host and device.
-#
-
-src_files := \
-    JNIHelp.cpp \
-    Register.cpp
-
-c_includes := \
-    $(JNI_H_INCLUDE)
-
-# Any shared/static libs required by libcore
-# need to be mentioned here as well.
-# TODO: fix this requirement
-
-shared_libraries := \
-    libcrypto  \
-    libicui18n \
-    libicuuc   \
-    libssl
-
-static_libraries := \
-    libjavacore \
-    libfdlibm
-
-
-
-#
-# Build for the target (device).
-#
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(src_files)
-LOCAL_C_INCLUDES := $(c_includes)
-LOCAL_STATIC_LIBRARIES := $(static_libraries)
-LOCAL_SHARED_LIBRARIES := $(shared_libraries) libcutils libexpat liblog libstlport libz
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE := libnativehelper
-
-include $(BUILD_SHARED_LIBRARY)
-
-
-#
-# Build for the host.
-#
-
-ifeq ($(WITH_HOST_DALVIK),true)
-
-    include $(CLEAR_VARS)
-
-    LOCAL_SRC_FILES := $(src_files)
-    LOCAL_C_INCLUDES := $(c_includes)
-    LOCAL_WHOLE_STATIC_LIBRARIES := $(static_libraries:%=%-host)
-
-    ifeq ($(HOST_OS)-$(HOST_ARCH),darwin-x86)
-        # OSX has a lot of libraries built in, which we don't have to
-        # bother building; just include them on the ld line.
-        LOCAL_LDLIBS := -lexpat -lssl -lz -lcrypto -licucore
-    else
-        LOCAL_SHARED_LIBRARIES := $(shared_libraries)
-        LOCAL_STATIC_LIBRARIES := libcutils libexpat liblog libz
-    endif
-
-    LOCAL_MODULE_TAGS := optional
-    LOCAL_MODULE := libnativehelper
-    include $(BUILD_HOST_STATIC_LIBRARY)
-
-endif
diff --git a/libnativehelper/JNIHelp.cpp b/libnativehelper/JNIHelp.cpp
deleted file mode 100644 (file)
index bf50930..0000000
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "JNIHelp"
-
-#include "JNIHelp.h"
-#include "cutils/log.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
-
-/**
- * Equivalent to ScopedLocalRef, but for C_JNIEnv instead. (And slightly more powerful.)
- */
-template<typename T>
-class scoped_local_ref {
-public:
-    scoped_local_ref(C_JNIEnv* env, T localRef = NULL)
-    : mEnv(env), mLocalRef(localRef)
-    {
-    }
-
-    ~scoped_local_ref() {
-        reset();
-    }
-
-    void reset(T localRef = NULL) {
-        if (mLocalRef != NULL) {
-            (*mEnv)->DeleteLocalRef(reinterpret_cast<JNIEnv*>(mEnv), mLocalRef);
-            mLocalRef = localRef;
-        }
-    }
-
-    T get() const {
-        return mLocalRef;
-    }
-
-private:
-    C_JNIEnv* mEnv;
-    T mLocalRef;
-
-    // Disallow copy and assignment.
-    scoped_local_ref(const scoped_local_ref&);
-    void operator=(const scoped_local_ref&);
-};
-
-static jclass findClass(C_JNIEnv* env, const char* className) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-    return (*env)->FindClass(e, className);
-}
-
-extern "C" int jniRegisterNativeMethods(C_JNIEnv* env, const char* className,
-    const JNINativeMethod* gMethods, int numMethods)
-{
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    ALOGV("Registering %s natives", 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();
-    }
-
-    if ((*env)->RegisterNatives(e, c.get(), gMethods, numMethods) < 0) {
-        ALOGE("RegisterNatives failed for '%s', aborting", className);
-        abort();
-    }
-
-    return 0;
-}
-
-/*
- * Returns a human-readable summary of an exception object.  The buffer will
- * be populated with the "binary" class name and, if present, the
- * exception message.
- */
-static char* getExceptionSummary0(C_JNIEnv* env, jthrowable exception) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    /* get the name of the exception's class */
-    scoped_local_ref<jclass> exceptionClass(env, (*env)->GetObjectClass(e, exception)); // can't fail
-    scoped_local_ref<jclass> classClass(env,
-            (*env)->GetObjectClass(e, exceptionClass.get())); // java.lang.Class, can't fail
-    jmethodID classGetNameMethod =
-            (*env)->GetMethodID(e, classClass.get(), "getName", "()Ljava/lang/String;");
-    scoped_local_ref<jstring> classNameStr(env,
-            (jstring) (*env)->CallObjectMethod(e, exceptionClass.get(), classGetNameMethod));
-    if (classNameStr.get() == NULL) {
-        return NULL;
-    }
-
-    /* get printable string */
-    const char* classNameChars = (*env)->GetStringUTFChars(e, classNameStr.get(), NULL);
-    if (classNameChars == NULL) {
-        return NULL;
-    }
-
-    /* if the exception has a detail message, get that */
-    jmethodID getMessage =
-            (*env)->GetMethodID(e, exceptionClass.get(), "getMessage", "()Ljava/lang/String;");
-    scoped_local_ref<jstring> messageStr(env,
-            (jstring) (*env)->CallObjectMethod(e, exception, getMessage));
-    if (messageStr.get() == NULL) {
-        return strdup(classNameChars);
-    }
-
-    char* result = NULL;
-    const char* messageChars = (*env)->GetStringUTFChars(e, messageStr.get(), NULL);
-    if (messageChars != NULL) {
-        asprintf(&result, "%s: %s", classNameChars, messageChars);
-        (*env)->ReleaseStringUTFChars(e, messageStr.get(), messageChars);
-    } else {
-        (*env)->ExceptionClear(e); // clear OOM
-        asprintf(&result, "%s: <error getting message>", classNameChars);
-    }
-
-    (*env)->ReleaseStringUTFChars(e, classNameStr.get(), classNameChars);
-    return result;
-}
-
-static char* getExceptionSummary(C_JNIEnv* env, jthrowable exception) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-    char* result = getExceptionSummary0(env, exception);
-    if (result == NULL) {
-        (*env)->ExceptionClear(e);
-        result = strdup("<error getting class name>");
-    }
-    return result;
-}
-
-/*
- * Returns an exception (with stack trace) as a string.
- */
-static char* getStackTrace(C_JNIEnv* env, jthrowable exception) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    scoped_local_ref<jclass> stringWriterClass(env, findClass(env, "java/io/StringWriter"));
-    if (stringWriterClass.get() == NULL) {
-        return NULL;
-    }
-
-    jmethodID stringWriterCtor = (*env)->GetMethodID(e, stringWriterClass.get(), "<init>", "()V");
-    jmethodID stringWriterToStringMethod =
-            (*env)->GetMethodID(e, stringWriterClass.get(), "toString", "()Ljava/lang/String;");
-
-    scoped_local_ref<jclass> printWriterClass(env, findClass(env, "java/io/PrintWriter"));
-    if (printWriterClass.get() == NULL) {
-        return NULL;
-    }
-
-    jmethodID printWriterCtor =
-            (*env)->GetMethodID(e, printWriterClass.get(), "<init>", "(Ljava/io/Writer;)V");
-
-    scoped_local_ref<jobject> stringWriter(env,
-            (*env)->NewObject(e, stringWriterClass.get(), stringWriterCtor));
-    if (stringWriter.get() == NULL) {
-        return NULL;
-    }
-
-    jobject printWriter =
-            (*env)->NewObject(e, printWriterClass.get(), printWriterCtor, stringWriter.get());
-    if (printWriter == NULL) {
-        return NULL;
-    }
-
-    scoped_local_ref<jclass> exceptionClass(env, (*env)->GetObjectClass(e, exception)); // can't fail
-    jmethodID printStackTraceMethod =
-            (*env)->GetMethodID(e, exceptionClass.get(), "printStackTrace", "(Ljava/io/PrintWriter;)V");
-    (*env)->CallVoidMethod(e, exception, printStackTraceMethod, printWriter);
-
-    if ((*env)->ExceptionCheck(e)) {
-        return NULL;
-    }
-
-    scoped_local_ref<jstring> messageStr(env,
-            (jstring) (*env)->CallObjectMethod(e, stringWriter.get(), stringWriterToStringMethod));
-    if (messageStr.get() == NULL) {
-        return NULL;
-    }
-
-    const char* utfChars = (*env)->GetStringUTFChars(e, messageStr.get(), NULL);
-    if (utfChars == NULL) {
-        return NULL;
-    }
-
-    char* result = strdup(utfChars);
-    (*env)->ReleaseStringUTFChars(e, messageStr.get(), utfChars);
-    return result;
-}
-
-extern "C" int jniThrowException(C_JNIEnv* env, const char* className, const char* msg) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    if ((*env)->ExceptionCheck(e)) {
-        /* TODO: consider creating the new exception with this as "cause" */
-        scoped_local_ref<jthrowable> exception(env, (*env)->ExceptionOccurred(e));
-        (*env)->ExceptionClear(e);
-
-        if (exception.get() != NULL) {
-            char* text = getExceptionSummary(env, exception.get());
-            ALOGW("Discarding pending exception (%s) to throw %s", text, className);
-            free(text);
-        }
-    }
-
-    scoped_local_ref<jclass> exceptionClass(env, findClass(env, className));
-    if (exceptionClass.get() == NULL) {
-        ALOGE("Unable to find exception class %s", className);
-        /* ClassNotFoundException now pending */
-        return -1;
-    }
-
-    if ((*env)->ThrowNew(e, exceptionClass.get(), msg) != JNI_OK) {
-        ALOGE("Failed throwing '%s' '%s'", className, msg);
-        /* an exception, most likely OOM, will now be pending */
-        return -1;
-    }
-
-    return 0;
-}
-
-int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args) {
-    char msgBuf[512];
-    vsnprintf(msgBuf, sizeof(msgBuf), fmt, args);
-    return jniThrowException(env, className, msgBuf);
-}
-
-int jniThrowNullPointerException(C_JNIEnv* env, const char* msg) {
-    return jniThrowException(env, "java/lang/NullPointerException", msg);
-}
-
-int jniThrowRuntimeException(C_JNIEnv* env, const char* msg) {
-    return jniThrowException(env, "java/lang/RuntimeException", msg);
-}
-
-int jniThrowIOException(C_JNIEnv* env, int errnum) {
-    char buffer[80];
-    const char* message = jniStrError(errnum, buffer, sizeof(buffer));
-    return jniThrowException(env, "java/io/IOException", message);
-}
-
-void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    scoped_local_ref<jthrowable> currentException(env, (*env)->ExceptionOccurred(e));
-    if (exception == NULL) {
-        exception = currentException.get();
-        if (exception == NULL) {
-            return;
-        }
-    }
-
-    if (currentException.get() != NULL) {
-        (*env)->ExceptionClear(e);
-    }
-
-    char* buffer = getStackTrace(env, exception);
-    if (buffer == NULL) {
-        (*env)->ExceptionClear(e);
-        buffer = getExceptionSummary(env, exception);
-    }
-
-    __android_log_write(priority, tag, buffer);
-    free(buffer);
-
-    if (currentException.get() != NULL) {
-        (*env)->Throw(e, currentException.get()); // rethrow
-    }
-}
-
-const char* jniStrError(int errnum, char* buf, size_t buflen) {
-    // Note: glibc has a nonstandard strerror_r that returns char* rather than POSIX's int.
-    // char *strerror_r(int errnum, char *buf, size_t n);
-    char* ret = (char*) strerror_r(errnum, buf, buflen);
-    if (((int)ret) == 0) {
-        // POSIX strerror_r, success
-        return buf;
-    } else if (((int)ret) == -1) {
-        // POSIX strerror_r, failure
-        // (Strictly, POSIX only guarantees a value other than 0. The safest
-        // way to implement this function is to use C++ and overload on the
-        // type of strerror_r to accurately distinguish GNU from POSIX. But
-        // realistic implementations will always return -1.)
-        snprintf(buf, buflen, "errno %d", errnum);
-        return buf;
-    } else {
-        // glibc strerror_r returning a string
-        return ret;
-    }
-}
-
-static struct CachedFields {
-    jclass fileDescriptorClass;
-    jmethodID fileDescriptorCtor;
-    jfieldID descriptorField;
-} gCachedFields;
-
-int registerJniHelp(JNIEnv* env) {
-    gCachedFields.fileDescriptorClass =
-            reinterpret_cast<jclass>(env->NewGlobalRef(env->FindClass("java/io/FileDescriptor")));
-    if (gCachedFields.fileDescriptorClass == NULL) {
-        return -1;
-    }
-
-    gCachedFields.fileDescriptorCtor =
-            env->GetMethodID(gCachedFields.fileDescriptorClass, "<init>", "()V");
-    if (gCachedFields.fileDescriptorCtor == NULL) {
-        return -1;
-    }
-
-    gCachedFields.descriptorField =
-            env->GetFieldID(gCachedFields.fileDescriptorClass, "descriptor", "I");
-    if (gCachedFields.descriptorField == NULL) {
-        return -1;
-    }
-
-    return 0;
-}
-
-jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-    jobject fileDescriptor = (*env)->NewObject(e,
-            gCachedFields.fileDescriptorClass, gCachedFields.fileDescriptorCtor);
-    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);
-}
-
-void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-    (*env)->SetIntField(e, fileDescriptor, gCachedFields.descriptorField, value);
-}
-
-/*
- * DO NOT USE THIS FUNCTION
- *
- * Get a pointer to the elements of a non-movable array.
- *
- * The semantics are similar to GetDirectBufferAddress.  Specifically, the VM
- * guarantees that the array will not move, and the caller must ensure that
- * it does not continue to use the pointer after the object is collected.
- *
- * We currently use an illegal sequence that trips up CheckJNI when
- * the "forcecopy" mode is enabled.  We pass in a magic value to work
- * around the problem.
- *
- * Returns NULL if the array is movable.
- */
-#define kNoCopyMagic 0xd5aab57f     /* also in CheckJni.c */
-extern "C" jbyte* jniGetNonMovableArrayElements(C_JNIEnv* env, jarray arrayObj) {
-    JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
-
-    jbyteArray byteArray = reinterpret_cast<jbyteArray>(arrayObj);
-
-    /*
-     * Normally the "isCopy" parameter is for a return value only, so the
-     * non-CheckJNI VM will ignore whatever we pass in.
-     */
-    uint32_t noCopy = kNoCopyMagic;
-    jbyte* result = (*env)->GetByteArrayElements(e, byteArray, reinterpret_cast<jboolean*>(&noCopy));
-
-    /*
-     * The non-CheckJNI implementation only cares about the array object,
-     * so we can replace the element pointer with the magic value.
-     */
-    (*env)->ReleaseByteArrayElements(e, byteArray, reinterpret_cast<jbyte*>(kNoCopyMagic), 0);
-    return result;
-}
diff --git a/libnativehelper/MODULE_LICENSE_APACHE2 b/libnativehelper/MODULE_LICENSE_APACHE2
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/libnativehelper/NOTICE b/libnativehelper/NOTICE
deleted file mode 100644 (file)
index c5b1efa..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-
-   Copyright (c) 2005-2008, The Android Open Source Project
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
diff --git a/libnativehelper/README b/libnativehelper/README
deleted file mode 100644 (file)
index 5a5f5d4..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Support functions for Android's class libraries
-
-
-These are VM-agnostic native functions that implement methods for system
-class libraries.  All code here:
-
- - MUST not be associated with an android.* class (that code lives in
-   frameworks/base/).
- - SHOULD be written in C rather than C++ where possible.
-
-Some helper functions are defined in include/nativehelper/JNIHelp.h.
diff --git a/libnativehelper/Register.cpp b/libnativehelper/Register.cpp
deleted file mode 100644 (file)
index b6b1b1f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "jni.h"
-
-extern int registerCoreLibrariesJni(JNIEnv* env);
-extern int registerJniHelp(JNIEnv* env);
-
-/*
- * Register all methods for system classes.
- */
-int jniRegisterSystemMethods(JNIEnv* env) {
-    // JniHelp depends on core library classes such as java.io.FileDescriptor.
-    return registerCoreLibrariesJni(env) != -1 && registerJniHelp(env) != -1;
-}
diff --git a/libnativehelper/include/nativehelper/JNIHelp.h b/libnativehelper/include/nativehelper/JNIHelp.h
deleted file mode 100644 (file)
index f5666f2..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * JNI helper functions.
- *
- * This file may be included by C or C++ code, which is trouble because jni.h
- * uses different typedefs for JNIEnv in each language.
- */
-#ifndef NATIVEHELPER_JNIHELP_H_
-#define NATIVEHELPER_JNIHELP_H_
-
-#include "jni.h"
-#include "cutils/log.h"
-#include <unistd.h>
-
-#ifndef NELEM
-# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Register one or more native methods with a particular class.
- * "className" looks like "java/lang/String".
- */
-int jniRegisterNativeMethods(C_JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods);
-
-/*
- * Throw an exception with the specified class and an optional message.
- *
- * The "className" argument will be passed directly to FindClass, which
- * takes strings with slashes (e.g. "java/lang/Object").
- *
- * If an exception is currently pending, we log a warning message and
- * clear it.
- *
- * Returns 0 on success, nonzero if something failed (e.g. the exception
- * class couldn't be found, so *an* exception will still be pending).
- *
- * Currently aborts the VM if it can't throw the exception.
- */
-int jniThrowException(C_JNIEnv* env, const char* className, const char* msg);
-
-/*
- * Throw a java.lang.NullPointerException, with an optional message.
- */
-int jniThrowNullPointerException(C_JNIEnv* env, const char* msg);
-
-/*
- * Throw a java.lang.RuntimeException, with an optional message.
- */
-int jniThrowRuntimeException(C_JNIEnv* env, const char* msg);
-
-/*
- * Throw a java.io.IOException, generating the message from errno.
- */
-int jniThrowIOException(C_JNIEnv* env, int errnum);
-
-/*
- * Return a pointer to a locale-dependent error string explaining errno
- * value 'errnum'. The returned pointer may or may not be equal to 'buf'.
- * This function is thread-safe (unlike strerror) and portable (unlike
- * strerror_r).
- */
-const char* jniStrError(int errnum, char* buf, size_t buflen);
-
-/*
- * Returns a new java.io.FileDescriptor for the given int fd.
- */
-jobject jniCreateFileDescriptor(C_JNIEnv* env, int fd);
-
-/*
- * Returns the int fd from a java.io.FileDescriptor.
- */
-int jniGetFDFromFileDescriptor(C_JNIEnv* env, jobject fileDescriptor);
-
-/*
- * Sets the int fd in a java.io.FileDescriptor.
- */
-void jniSetFileDescriptorOfFD(C_JNIEnv* env, jobject fileDescriptor, int value);
-
-/*
- * Log a message and an exception.
- * If exception is NULL, logs the current exception in the JNI environment.
- */
-void jniLogException(C_JNIEnv* env, int priority, const char* tag, jthrowable exception);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-/*
- * For C++ code, we provide inlines that map to the C functions.  g++ always
- * inlines these, even on non-optimized builds.
- */
-#if defined(__cplusplus)
-inline int jniRegisterNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods) {
-    return jniRegisterNativeMethods(&env->functions, className, gMethods, numMethods);
-}
-
-inline int jniThrowException(JNIEnv* env, const char* className, const char* msg) {
-    return jniThrowException(&env->functions, className, msg);
-}
-
-extern "C" int jniThrowExceptionFmt(C_JNIEnv* env, const char* className, const char* fmt, va_list args);
-
-/*
- * Equivalent to jniThrowException but with a printf-like format string and
- * variable-length argument list. This is only available in C++.
- */
-inline int jniThrowExceptionFmt(JNIEnv* env, const char* className, const char* fmt, ...) {
-    va_list args;
-    va_start(args, fmt);
-    return jniThrowExceptionFmt(&env->functions, className, fmt, args);
-    va_end(args);
-}
-
-inline int jniThrowNullPointerException(JNIEnv* env, const char* msg) {
-    return jniThrowNullPointerException(&env->functions, msg);
-}
-
-inline int jniThrowRuntimeException(JNIEnv* env, const char* msg) {
-    return jniThrowRuntimeException(&env->functions, msg);
-}
-
-inline int jniThrowIOException(JNIEnv* env, int errnum) {
-    return jniThrowIOException(&env->functions, errnum);
-}
-
-inline jobject jniCreateFileDescriptor(JNIEnv* env, int fd) {
-    return jniCreateFileDescriptor(&env->functions, fd);
-}
-
-inline int jniGetFDFromFileDescriptor(JNIEnv* env, jobject fileDescriptor) {
-    return jniGetFDFromFileDescriptor(&env->functions, fileDescriptor);
-}
-
-inline void jniSetFileDescriptorOfFD(JNIEnv* env, jobject fileDescriptor, int value) {
-    jniSetFileDescriptorOfFD(&env->functions, fileDescriptor, value);
-}
-
-inline void jniLogException(JNIEnv* env, int priority, const char* tag, jthrowable exception = NULL) {
-    jniLogException(&env->functions, priority, tag, exception);
-}
-#endif
-
-/* Logging macros.
- *
- * Logs an exception.  If the exception is omitted or NULL, logs the current exception
- * from the JNI environment, if any.
- */
-#define LOG_EX(env, priority, tag, ...) \
-    IF_ALOG(priority, tag) jniLogException(env, ANDROID_##priority, tag, ##__VA_ARGS__)
-#define LOGV_EX(env, ...) LOG_EX(env, LOG_VERBOSE, LOG_TAG, ##__VA_ARGS__)
-#define LOGD_EX(env, ...) LOG_EX(env, LOG_DEBUG, LOG_TAG, ##__VA_ARGS__)
-#define LOGI_EX(env, ...) LOG_EX(env, LOG_INFO, LOG_TAG, ##__VA_ARGS__)
-#define LOGW_EX(env, ...) LOG_EX(env, LOG_WARN, LOG_TAG, ##__VA_ARGS__)
-#define LOGE_EX(env, ...) LOG_EX(env, LOG_ERROR, LOG_TAG, ##__VA_ARGS__)
-
-/*
- * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
- * <unistd.h>. (Alas, it is not as standard as we'd hoped!) So, if it's
- * not already defined, then define it here.
- */
-#ifndef TEMP_FAILURE_RETRY
-/* Used to retry syscalls that can return EINTR. */
-#define TEMP_FAILURE_RETRY(exp) ({         \
-    typeof (exp) _rc;                      \
-    do {                                   \
-        _rc = (exp);                       \
-    } while (_rc == -1 && errno == EINTR); \
-    _rc; })
-#endif
-
-#endif  /* NATIVEHELPER_JNIHELP_H_ */
diff --git a/libnativehelper/include/nativehelper/jni.h b/libnativehelper/include/nativehelper/jni.h
deleted file mode 100644 (file)
index e4d74cf..0000000
+++ /dev/null
@@ -1,1154 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * JNI specification, as defined by Sun:
- * http://java.sun.com/javase/6/docs/technotes/guides/jni/spec/jniTOC.html
- *
- * Everything here is expected to be VM-neutral.
- */
-
-#ifndef JNI_H_
-#define JNI_H_
-
-#include <stdarg.h>
-
-/*
- * Primitive types that match up with Java equivalents.
- */
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>      /* C99 */
-typedef uint8_t         jboolean;       /* unsigned 8 bits */
-typedef int8_t          jbyte;          /* signed 8 bits */
-typedef uint16_t        jchar;          /* unsigned 16 bits */
-typedef int16_t         jshort;         /* signed 16 bits */
-typedef int32_t         jint;           /* signed 32 bits */
-typedef int64_t         jlong;          /* signed 64 bits */
-typedef float           jfloat;         /* 32-bit IEEE 754 */
-typedef double          jdouble;        /* 64-bit IEEE 754 */
-#else
-typedef unsigned char   jboolean;       /* unsigned 8 bits */
-typedef signed char     jbyte;          /* signed 8 bits */
-typedef unsigned short  jchar;          /* unsigned 16 bits */
-typedef short           jshort;         /* signed 16 bits */
-typedef int             jint;           /* signed 32 bits */
-typedef long long       jlong;          /* signed 64 bits */
-typedef float           jfloat;         /* 32-bit IEEE 754 */
-typedef double          jdouble;        /* 64-bit IEEE 754 */
-#endif
-
-/* "cardinal indices and sizes" */
-typedef jint            jsize;
-
-#ifdef __cplusplus
-/*
- * Reference types, in C++
- */
-class _jobject {};
-class _jclass : public _jobject {};
-class _jstring : public _jobject {};
-class _jarray : public _jobject {};
-class _jobjectArray : public _jarray {};
-class _jbooleanArray : public _jarray {};
-class _jbyteArray : public _jarray {};
-class _jcharArray : public _jarray {};
-class _jshortArray : public _jarray {};
-class _jintArray : public _jarray {};
-class _jlongArray : public _jarray {};
-class _jfloatArray : public _jarray {};
-class _jdoubleArray : public _jarray {};
-class _jthrowable : public _jobject {};
-
-typedef _jobject*       jobject;
-typedef _jclass*        jclass;
-typedef _jstring*       jstring;
-typedef _jarray*        jarray;
-typedef _jobjectArray*  jobjectArray;
-typedef _jbooleanArray* jbooleanArray;
-typedef _jbyteArray*    jbyteArray;
-typedef _jcharArray*    jcharArray;
-typedef _jshortArray*   jshortArray;
-typedef _jintArray*     jintArray;
-typedef _jlongArray*    jlongArray;
-typedef _jfloatArray*   jfloatArray;
-typedef _jdoubleArray*  jdoubleArray;
-typedef _jthrowable*    jthrowable;
-typedef _jobject*       jweak;
-
-
-#else /* not __cplusplus */
-
-/*
- * Reference types, in C.
- */
-typedef void*           jobject;
-typedef jobject         jclass;
-typedef jobject         jstring;
-typedef jobject         jarray;
-typedef jarray          jobjectArray;
-typedef jarray          jbooleanArray;
-typedef jarray          jbyteArray;
-typedef jarray          jcharArray;
-typedef jarray          jshortArray;
-typedef jarray          jintArray;
-typedef jarray          jlongArray;
-typedef jarray          jfloatArray;
-typedef jarray          jdoubleArray;
-typedef jobject         jthrowable;
-typedef jobject         jweak;
-
-#endif /* not __cplusplus */
-
-struct _jfieldID;                       /* opaque structure */
-typedef struct _jfieldID* jfieldID;     /* field IDs */
-
-struct _jmethodID;                      /* opaque structure */
-typedef struct _jmethodID* jmethodID;   /* method IDs */
-
-struct JNIInvokeInterface;
-
-typedef union jvalue {
-    jboolean    z;
-    jbyte       b;
-    jchar       c;
-    jshort      s;
-    jint        i;
-    jlong       j;
-    jfloat      f;
-    jdouble     d;
-    jobject     l;
-} jvalue;
-
-typedef enum jobjectRefType {
-    JNIInvalidRefType = 0,
-    JNILocalRefType = 1,
-    JNIGlobalRefType = 2,
-    JNIWeakGlobalRefType = 3
-} jobjectRefType;
-
-typedef struct {
-    const char* name;
-    const char* signature;
-    void*       fnPtr;
-} JNINativeMethod;
-
-struct _JNIEnv;
-struct _JavaVM;
-typedef const struct JNINativeInterface* C_JNIEnv;
-
-#if defined(__cplusplus)
-typedef _JNIEnv JNIEnv;
-typedef _JavaVM JavaVM;
-#else
-typedef const struct JNINativeInterface* JNIEnv;
-typedef const struct JNIInvokeInterface* JavaVM;
-#endif
-
-/*
- * Table of interface function pointers.
- */
-struct JNINativeInterface {
-    void*       reserved0;
-    void*       reserved1;
-    void*       reserved2;
-    void*       reserved3;
-
-    jint        (*GetVersion)(JNIEnv *);
-
-    jclass      (*DefineClass)(JNIEnv*, const char*, jobject, const jbyte*,
-                        jsize);
-    jclass      (*FindClass)(JNIEnv*, const char*);
-
-    jmethodID   (*FromReflectedMethod)(JNIEnv*, jobject);
-    jfieldID    (*FromReflectedField)(JNIEnv*, jobject);
-    /* spec doesn't show jboolean parameter */
-    jobject     (*ToReflectedMethod)(JNIEnv*, jclass, jmethodID, jboolean);
-
-    jclass      (*GetSuperclass)(JNIEnv*, jclass);
-    jboolean    (*IsAssignableFrom)(JNIEnv*, jclass, jclass);
-
-    /* spec doesn't show jboolean parameter */
-    jobject     (*ToReflectedField)(JNIEnv*, jclass, jfieldID, jboolean);
-
-    jint        (*Throw)(JNIEnv*, jthrowable);
-    jint        (*ThrowNew)(JNIEnv *, jclass, const char *);
-    jthrowable  (*ExceptionOccurred)(JNIEnv*);
-    void        (*ExceptionDescribe)(JNIEnv*);
-    void        (*ExceptionClear)(JNIEnv*);
-    void        (*FatalError)(JNIEnv*, const char*);
-
-    jint        (*PushLocalFrame)(JNIEnv*, jint);
-    jobject     (*PopLocalFrame)(JNIEnv*, jobject);
-
-    jobject     (*NewGlobalRef)(JNIEnv*, jobject);
-    void        (*DeleteGlobalRef)(JNIEnv*, jobject);
-    void        (*DeleteLocalRef)(JNIEnv*, jobject);
-    jboolean    (*IsSameObject)(JNIEnv*, jobject, jobject);
-
-    jobject     (*NewLocalRef)(JNIEnv*, jobject);
-    jint        (*EnsureLocalCapacity)(JNIEnv*, jint);
-
-    jobject     (*AllocObject)(JNIEnv*, jclass);
-    jobject     (*NewObject)(JNIEnv*, jclass, jmethodID, ...);
-    jobject     (*NewObjectV)(JNIEnv*, jclass, jmethodID, va_list);
-    jobject     (*NewObjectA)(JNIEnv*, jclass, jmethodID, jvalue*);
-
-    jclass      (*GetObjectClass)(JNIEnv*, jobject);
-    jboolean    (*IsInstanceOf)(JNIEnv*, jobject, jclass);
-    jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
-
-    jobject     (*CallObjectMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jobject     (*CallObjectMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jobject     (*CallObjectMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jboolean    (*CallBooleanMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jboolean    (*CallBooleanMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jboolean    (*CallBooleanMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jbyte       (*CallByteMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jbyte       (*CallByteMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jbyte       (*CallByteMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jchar       (*CallCharMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jchar       (*CallCharMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jchar       (*CallCharMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jshort      (*CallShortMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jshort      (*CallShortMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jshort      (*CallShortMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jint        (*CallIntMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jint        (*CallIntMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jint        (*CallIntMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jlong       (*CallLongMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jlong       (*CallLongMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jlong       (*CallLongMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jfloat      (*CallFloatMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jfloat      (*CallFloatMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jfloat      (*CallFloatMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    jdouble     (*CallDoubleMethod)(JNIEnv*, jobject, jmethodID, ...);
-    jdouble     (*CallDoubleMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    jdouble     (*CallDoubleMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-    void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
-    void        (*CallVoidMethodV)(JNIEnv*, jobject, jmethodID, va_list);
-    void        (*CallVoidMethodA)(JNIEnv*, jobject, jmethodID, jvalue*);
-
-    jobject     (*CallNonvirtualObjectMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jobject     (*CallNonvirtualObjectMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jobject     (*CallNonvirtualObjectMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jboolean    (*CallNonvirtualBooleanMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jboolean    (*CallNonvirtualBooleanMethodV)(JNIEnv*, jobject, jclass,
-                         jmethodID, va_list);
-    jboolean    (*CallNonvirtualBooleanMethodA)(JNIEnv*, jobject, jclass,
-                         jmethodID, jvalue*);
-    jbyte       (*CallNonvirtualByteMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jbyte       (*CallNonvirtualByteMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jbyte       (*CallNonvirtualByteMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jchar       (*CallNonvirtualCharMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jchar       (*CallNonvirtualCharMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jchar       (*CallNonvirtualCharMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jshort      (*CallNonvirtualShortMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jshort      (*CallNonvirtualShortMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jshort      (*CallNonvirtualShortMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jint        (*CallNonvirtualIntMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jint        (*CallNonvirtualIntMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jint        (*CallNonvirtualIntMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jlong       (*CallNonvirtualLongMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jlong       (*CallNonvirtualLongMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jlong       (*CallNonvirtualLongMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jfloat      (*CallNonvirtualFloatMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jfloat      (*CallNonvirtualFloatMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jfloat      (*CallNonvirtualFloatMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    jdouble     (*CallNonvirtualDoubleMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    jdouble     (*CallNonvirtualDoubleMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    jdouble     (*CallNonvirtualDoubleMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-    void        (*CallNonvirtualVoidMethod)(JNIEnv*, jobject, jclass,
-                        jmethodID, ...);
-    void        (*CallNonvirtualVoidMethodV)(JNIEnv*, jobject, jclass,
-                        jmethodID, va_list);
-    void        (*CallNonvirtualVoidMethodA)(JNIEnv*, jobject, jclass,
-                        jmethodID, jvalue*);
-
-    jfieldID    (*GetFieldID)(JNIEnv*, jclass, const char*, const char*);
-
-    jobject     (*GetObjectField)(JNIEnv*, jobject, jfieldID);
-    jboolean    (*GetBooleanField)(JNIEnv*, jobject, jfieldID);
-    jbyte       (*GetByteField)(JNIEnv*, jobject, jfieldID);
-    jchar       (*GetCharField)(JNIEnv*, jobject, jfieldID);
-    jshort      (*GetShortField)(JNIEnv*, jobject, jfieldID);
-    jint        (*GetIntField)(JNIEnv*, jobject, jfieldID);
-    jlong       (*GetLongField)(JNIEnv*, jobject, jfieldID);
-    jfloat      (*GetFloatField)(JNIEnv*, jobject, jfieldID);
-    jdouble     (*GetDoubleField)(JNIEnv*, jobject, jfieldID);
-
-    void        (*SetObjectField)(JNIEnv*, jobject, jfieldID, jobject);
-    void        (*SetBooleanField)(JNIEnv*, jobject, jfieldID, jboolean);
-    void        (*SetByteField)(JNIEnv*, jobject, jfieldID, jbyte);
-    void        (*SetCharField)(JNIEnv*, jobject, jfieldID, jchar);
-    void        (*SetShortField)(JNIEnv*, jobject, jfieldID, jshort);
-    void        (*SetIntField)(JNIEnv*, jobject, jfieldID, jint);
-    void        (*SetLongField)(JNIEnv*, jobject, jfieldID, jlong);
-    void        (*SetFloatField)(JNIEnv*, jobject, jfieldID, jfloat);
-    void        (*SetDoubleField)(JNIEnv*, jobject, jfieldID, jdouble);
-
-    jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
-
-    jobject     (*CallStaticObjectMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jobject     (*CallStaticObjectMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jobject     (*CallStaticObjectMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jboolean    (*CallStaticBooleanMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jboolean    (*CallStaticBooleanMethodV)(JNIEnv*, jclass, jmethodID,
-                        va_list);
-    jboolean    (*CallStaticBooleanMethodA)(JNIEnv*, jclass, jmethodID,
-                        jvalue*);
-    jbyte       (*CallStaticByteMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jbyte       (*CallStaticByteMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jbyte       (*CallStaticByteMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jchar       (*CallStaticCharMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jchar       (*CallStaticCharMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jchar       (*CallStaticCharMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jshort      (*CallStaticShortMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jshort      (*CallStaticShortMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jshort      (*CallStaticShortMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jint        (*CallStaticIntMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jint        (*CallStaticIntMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jint        (*CallStaticIntMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jlong       (*CallStaticLongMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jlong       (*CallStaticLongMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jlong       (*CallStaticLongMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jfloat      (*CallStaticFloatMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jfloat      (*CallStaticFloatMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jfloat      (*CallStaticFloatMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    jdouble     (*CallStaticDoubleMethod)(JNIEnv*, jclass, jmethodID, ...);
-    jdouble     (*CallStaticDoubleMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    jdouble     (*CallStaticDoubleMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-    void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
-    void        (*CallStaticVoidMethodV)(JNIEnv*, jclass, jmethodID, va_list);
-    void        (*CallStaticVoidMethodA)(JNIEnv*, jclass, jmethodID, jvalue*);
-
-    jfieldID    (*GetStaticFieldID)(JNIEnv*, jclass, const char*,
-                        const char*);
-
-    jobject     (*GetStaticObjectField)(JNIEnv*, jclass, jfieldID);
-    jboolean    (*GetStaticBooleanField)(JNIEnv*, jclass, jfieldID);
-    jbyte       (*GetStaticByteField)(JNIEnv*, jclass, jfieldID);
-    jchar       (*GetStaticCharField)(JNIEnv*, jclass, jfieldID);
-    jshort      (*GetStaticShortField)(JNIEnv*, jclass, jfieldID);
-    jint        (*GetStaticIntField)(JNIEnv*, jclass, jfieldID);
-    jlong       (*GetStaticLongField)(JNIEnv*, jclass, jfieldID);
-    jfloat      (*GetStaticFloatField)(JNIEnv*, jclass, jfieldID);
-    jdouble     (*GetStaticDoubleField)(JNIEnv*, jclass, jfieldID);
-
-    void        (*SetStaticObjectField)(JNIEnv*, jclass, jfieldID, jobject);
-    void        (*SetStaticBooleanField)(JNIEnv*, jclass, jfieldID, jboolean);
-    void        (*SetStaticByteField)(JNIEnv*, jclass, jfieldID, jbyte);
-    void        (*SetStaticCharField)(JNIEnv*, jclass, jfieldID, jchar);
-    void        (*SetStaticShortField)(JNIEnv*, jclass, jfieldID, jshort);
-    void        (*SetStaticIntField)(JNIEnv*, jclass, jfieldID, jint);
-    void        (*SetStaticLongField)(JNIEnv*, jclass, jfieldID, jlong);
-    void        (*SetStaticFloatField)(JNIEnv*, jclass, jfieldID, jfloat);
-    void        (*SetStaticDoubleField)(JNIEnv*, jclass, jfieldID, jdouble);
-
-    jstring     (*NewString)(JNIEnv*, const jchar*, jsize);
-    jsize       (*GetStringLength)(JNIEnv*, jstring);
-    const jchar* (*GetStringChars)(JNIEnv*, jstring, jboolean*);
-    void        (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
-    jstring     (*NewStringUTF)(JNIEnv*, const char*);
-    jsize       (*GetStringUTFLength)(JNIEnv*, jstring);
-    /* JNI spec says this returns const jbyte*, but that's inconsistent */
-    const char* (*GetStringUTFChars)(JNIEnv*, jstring, jboolean*);
-    void        (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);
-    jsize       (*GetArrayLength)(JNIEnv*, jarray);
-    jobjectArray (*NewObjectArray)(JNIEnv*, jsize, jclass, jobject);
-    jobject     (*GetObjectArrayElement)(JNIEnv*, jobjectArray, jsize);
-    void        (*SetObjectArrayElement)(JNIEnv*, jobjectArray, jsize, jobject);
-
-    jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
-    jbyteArray    (*NewByteArray)(JNIEnv*, jsize);
-    jcharArray    (*NewCharArray)(JNIEnv*, jsize);
-    jshortArray   (*NewShortArray)(JNIEnv*, jsize);
-    jintArray     (*NewIntArray)(JNIEnv*, jsize);
-    jlongArray    (*NewLongArray)(JNIEnv*, jsize);
-    jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
-    jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize);
-
-    jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);
-    jbyte*      (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);
-    jchar*      (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);
-    jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);
-    jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
-    jlong*      (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);
-    jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);
-    jdouble*    (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);
-
-    void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,
-                        jboolean*, jint);
-    void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,
-                        jbyte*, jint);
-    void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,
-                        jchar*, jint);
-    void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,
-                        jshort*, jint);
-    void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,
-                        jint*, jint);
-    void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,
-                        jlong*, jint);
-    void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,
-                        jfloat*, jint);
-    void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,
-                        jdouble*, jint);
-
-    void        (*GetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
-                        jsize, jsize, jboolean*);
-    void        (*GetByteArrayRegion)(JNIEnv*, jbyteArray,
-                        jsize, jsize, jbyte*);
-    void        (*GetCharArrayRegion)(JNIEnv*, jcharArray,
-                        jsize, jsize, jchar*);
-    void        (*GetShortArrayRegion)(JNIEnv*, jshortArray,
-                        jsize, jsize, jshort*);
-    void        (*GetIntArrayRegion)(JNIEnv*, jintArray,
-                        jsize, jsize, jint*);
-    void        (*GetLongArrayRegion)(JNIEnv*, jlongArray,
-                        jsize, jsize, jlong*);
-    void        (*GetFloatArrayRegion)(JNIEnv*, jfloatArray,
-                        jsize, jsize, jfloat*);
-    void        (*GetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
-                        jsize, jsize, jdouble*);
-
-    /* spec shows these without const; some jni.h do, some don't */
-    void        (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,
-                        jsize, jsize, const jboolean*);
-    void        (*SetByteArrayRegion)(JNIEnv*, jbyteArray,
-                        jsize, jsize, const jbyte*);
-    void        (*SetCharArrayRegion)(JNIEnv*, jcharArray,
-                        jsize, jsize, const jchar*);
-    void        (*SetShortArrayRegion)(JNIEnv*, jshortArray,
-                        jsize, jsize, const jshort*);
-    void        (*SetIntArrayRegion)(JNIEnv*, jintArray,
-                        jsize, jsize, const jint*);
-    void        (*SetLongArrayRegion)(JNIEnv*, jlongArray,
-                        jsize, jsize, const jlong*);
-    void        (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,
-                        jsize, jsize, const jfloat*);
-    void        (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray,
-                        jsize, jsize, const jdouble*);
-
-    jint        (*RegisterNatives)(JNIEnv*, jclass, const JNINativeMethod*,
-                        jint);
-    jint        (*UnregisterNatives)(JNIEnv*, jclass);
-    jint        (*MonitorEnter)(JNIEnv*, jobject);
-    jint        (*MonitorExit)(JNIEnv*, jobject);
-    jint        (*GetJavaVM)(JNIEnv*, JavaVM**);
-
-    void        (*GetStringRegion)(JNIEnv*, jstring, jsize, jsize, jchar*);
-    void        (*GetStringUTFRegion)(JNIEnv*, jstring, jsize, jsize, char*);
-
-    void*       (*GetPrimitiveArrayCritical)(JNIEnv*, jarray, jboolean*);
-    void        (*ReleasePrimitiveArrayCritical)(JNIEnv*, jarray, void*, jint);
-
-    const jchar* (*GetStringCritical)(JNIEnv*, jstring, jboolean*);
-    void        (*ReleaseStringCritical)(JNIEnv*, jstring, const jchar*);
-
-    jweak       (*NewWeakGlobalRef)(JNIEnv*, jobject);
-    void        (*DeleteWeakGlobalRef)(JNIEnv*, jweak);
-
-    jboolean    (*ExceptionCheck)(JNIEnv*);
-
-    jobject     (*NewDirectByteBuffer)(JNIEnv*, void*, jlong);
-    void*       (*GetDirectBufferAddress)(JNIEnv*, jobject);
-    jlong       (*GetDirectBufferCapacity)(JNIEnv*, jobject);
-
-    /* added in JNI 1.6 */
-    jobjectRefType (*GetObjectRefType)(JNIEnv*, jobject);
-};
-
-/*
- * C++ object wrapper.
- *
- * This is usually overlaid on a C struct whose first element is a
- * JNINativeInterface*.  We rely somewhat on compiler behavior.
- */
-struct _JNIEnv {
-    /* do not rename this; it does not seem to be entirely opaque */
-    const struct JNINativeInterface* functions;
-
-#if defined(__cplusplus)
-
-    jint GetVersion()
-    { return functions->GetVersion(this); }
-
-    jclass DefineClass(const char *name, jobject loader, const jbyte* buf,
-        jsize bufLen)
-    { return functions->DefineClass(this, name, loader, buf, bufLen); }
-
-    jclass FindClass(const char* name)
-    { return functions->FindClass(this, name); }
-
-    jmethodID FromReflectedMethod(jobject method)
-    { return functions->FromReflectedMethod(this, method); }
-
-    jfieldID FromReflectedField(jobject field)
-    { return functions->FromReflectedField(this, field); }
-
-    jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic)
-    { return functions->ToReflectedMethod(this, cls, methodID, isStatic); }
-
-    jclass GetSuperclass(jclass clazz)
-    { return functions->GetSuperclass(this, clazz); }
-
-    jboolean IsAssignableFrom(jclass clazz1, jclass clazz2)
-    { return functions->IsAssignableFrom(this, clazz1, clazz2); }
-
-    jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic)
-    { return functions->ToReflectedField(this, cls, fieldID, isStatic); }
-
-    jint Throw(jthrowable obj)
-    { return functions->Throw(this, obj); }
-
-    jint ThrowNew(jclass clazz, const char* message)
-    { return functions->ThrowNew(this, clazz, message); }
-
-    jthrowable ExceptionOccurred()
-    { return functions->ExceptionOccurred(this); }
-
-    void ExceptionDescribe()
-    { functions->ExceptionDescribe(this); }
-
-    void ExceptionClear()
-    { functions->ExceptionClear(this); }
-
-    void FatalError(const char* msg)
-    { functions->FatalError(this, msg); }
-
-    jint PushLocalFrame(jint capacity)
-    { return functions->PushLocalFrame(this, capacity); }
-
-    jobject PopLocalFrame(jobject result)
-    { return functions->PopLocalFrame(this, result); }
-
-    jobject NewGlobalRef(jobject obj)
-    { return functions->NewGlobalRef(this, obj); }
-
-    void DeleteGlobalRef(jobject globalRef)
-    { functions->DeleteGlobalRef(this, globalRef); }
-
-    void DeleteLocalRef(jobject localRef)
-    { functions->DeleteLocalRef(this, localRef); }
-
-    jboolean IsSameObject(jobject ref1, jobject ref2)
-    { return functions->IsSameObject(this, ref1, ref2); }
-
-    jobject NewLocalRef(jobject ref)
-    { return functions->NewLocalRef(this, ref); }
-
-    jint EnsureLocalCapacity(jint capacity)
-    { return functions->EnsureLocalCapacity(this, capacity); }
-
-    jobject AllocObject(jclass clazz)
-    { return functions->AllocObject(this, clazz); }
-
-    jobject NewObject(jclass clazz, jmethodID methodID, ...)
-    {
-        va_list args;
-        va_start(args, methodID);
-        jobject result = functions->NewObjectV(this, clazz, methodID, args);
-        va_end(args);
-        return result;
-    }
-
-    jobject NewObjectV(jclass clazz, jmethodID methodID, va_list args)
-    { return functions->NewObjectV(this, clazz, methodID, args); }
-
-    jobject NewObjectA(jclass clazz, jmethodID methodID, jvalue* args)
-    { return functions->NewObjectA(this, clazz, methodID, args); }
-
-    jclass GetObjectClass(jobject obj)
-    { return functions->GetObjectClass(this, obj); }
-
-    jboolean IsInstanceOf(jobject obj, jclass clazz)
-    { return functions->IsInstanceOf(this, obj, clazz); }
-
-    jmethodID GetMethodID(jclass clazz, const char* name, const char* sig)
-    { return functions->GetMethodID(this, clazz, name, sig); }
-
-#define CALL_TYPE_METHOD(_jtype, _jname)                                    \
-    _jtype Call##_jname##Method(jobject obj, jmethodID methodID, ...)       \
-    {                                                                       \
-        _jtype result;                                                      \
-        va_list args;                                                       \
-        va_start(args, methodID);                                           \
-        result = functions->Call##_jname##MethodV(this, obj, methodID,      \
-                    args);                                                  \
-        va_end(args);                                                       \
-        return result;                                                      \
-    }
-#define CALL_TYPE_METHODV(_jtype, _jname)                                   \
-    _jtype Call##_jname##MethodV(jobject obj, jmethodID methodID,           \
-        va_list args)                                                       \
-    { return functions->Call##_jname##MethodV(this, obj, methodID, args); }
-#define CALL_TYPE_METHODA(_jtype, _jname)                                   \
-    _jtype Call##_jname##MethodA(jobject obj, jmethodID methodID,           \
-        jvalue* args)                                                       \
-    { return functions->Call##_jname##MethodA(this, obj, methodID, args); }
-
-#define CALL_TYPE(_jtype, _jname)                                           \
-    CALL_TYPE_METHOD(_jtype, _jname)                                        \
-    CALL_TYPE_METHODV(_jtype, _jname)                                       \
-    CALL_TYPE_METHODA(_jtype, _jname)
-
-    CALL_TYPE(jobject, Object)
-    CALL_TYPE(jboolean, Boolean)
-    CALL_TYPE(jbyte, Byte)
-    CALL_TYPE(jchar, Char)
-    CALL_TYPE(jshort, Short)
-    CALL_TYPE(jint, Int)
-    CALL_TYPE(jlong, Long)
-    CALL_TYPE(jfloat, Float)
-    CALL_TYPE(jdouble, Double)
-
-    void CallVoidMethod(jobject obj, jmethodID methodID, ...)
-    {
-        va_list args;
-        va_start(args, methodID);
-        functions->CallVoidMethodV(this, obj, methodID, args);
-        va_end(args);
-    }
-    void CallVoidMethodV(jobject obj, jmethodID methodID, va_list args)
-    { functions->CallVoidMethodV(this, obj, methodID, args); }
-    void CallVoidMethodA(jobject obj, jmethodID methodID, jvalue* args)
-    { functions->CallVoidMethodA(this, obj, methodID, args); }
-
-#define CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                            \
-    _jtype CallNonvirtual##_jname##Method(jobject obj, jclass clazz,        \
-        jmethodID methodID, ...)                                            \
-    {                                                                       \
-        _jtype result;                                                      \
-        va_list args;                                                       \
-        va_start(args, methodID);                                           \
-        result = functions->CallNonvirtual##_jname##MethodV(this, obj,      \
-                    clazz, methodID, args);                                 \
-        va_end(args);                                                       \
-        return result;                                                      \
-    }
-#define CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                           \
-    _jtype CallNonvirtual##_jname##MethodV(jobject obj, jclass clazz,       \
-        jmethodID methodID, va_list args)                                   \
-    { return functions->CallNonvirtual##_jname##MethodV(this, obj, clazz,   \
-        methodID, args); }
-#define CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)                           \
-    _jtype CallNonvirtual##_jname##MethodA(jobject obj, jclass clazz,       \
-        jmethodID methodID, jvalue* args)                                   \
-    { return functions->CallNonvirtual##_jname##MethodA(this, obj, clazz,   \
-        methodID, args); }
-
-#define CALL_NONVIRT_TYPE(_jtype, _jname)                                   \
-    CALL_NONVIRT_TYPE_METHOD(_jtype, _jname)                                \
-    CALL_NONVIRT_TYPE_METHODV(_jtype, _jname)                               \
-    CALL_NONVIRT_TYPE_METHODA(_jtype, _jname)
-
-    CALL_NONVIRT_TYPE(jobject, Object)
-    CALL_NONVIRT_TYPE(jboolean, Boolean)
-    CALL_NONVIRT_TYPE(jbyte, Byte)
-    CALL_NONVIRT_TYPE(jchar, Char)
-    CALL_NONVIRT_TYPE(jshort, Short)
-    CALL_NONVIRT_TYPE(jint, Int)
-    CALL_NONVIRT_TYPE(jlong, Long)
-    CALL_NONVIRT_TYPE(jfloat, Float)
-    CALL_NONVIRT_TYPE(jdouble, Double)
-
-    void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
-        jmethodID methodID, ...)
-    {
-        va_list args;
-        va_start(args, methodID);
-        functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args);
-        va_end(args);
-    }
-    void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
-        jmethodID methodID, va_list args)
-    { functions->CallNonvirtualVoidMethodV(this, obj, clazz, methodID, args); }
-    void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
-        jmethodID methodID, jvalue* args)
-    { functions->CallNonvirtualVoidMethodA(this, obj, clazz, methodID, args); }
-
-    jfieldID GetFieldID(jclass clazz, const char* name, const char* sig)
-    { return functions->GetFieldID(this, clazz, name, sig); }
-
-    jobject GetObjectField(jobject obj, jfieldID fieldID)
-    { return functions->GetObjectField(this, obj, fieldID); }
-    jboolean GetBooleanField(jobject obj, jfieldID fieldID)
-    { return functions->GetBooleanField(this, obj, fieldID); }
-    jbyte GetByteField(jobject obj, jfieldID fieldID)
-    { return functions->GetByteField(this, obj, fieldID); }
-    jchar GetCharField(jobject obj, jfieldID fieldID)
-    { return functions->GetCharField(this, obj, fieldID); }
-    jshort GetShortField(jobject obj, jfieldID fieldID)
-    { return functions->GetShortField(this, obj, fieldID); }
-    jint GetIntField(jobject obj, jfieldID fieldID)
-    { return functions->GetIntField(this, obj, fieldID); }
-    jlong GetLongField(jobject obj, jfieldID fieldID)
-    { return functions->GetLongField(this, obj, fieldID); }
-    jfloat GetFloatField(jobject obj, jfieldID fieldID)
-    { return functions->GetFloatField(this, obj, fieldID); }
-    jdouble GetDoubleField(jobject obj, jfieldID fieldID)
-    { return functions->GetDoubleField(this, obj, fieldID); }
-
-    void SetObjectField(jobject obj, jfieldID fieldID, jobject value)
-    { functions->SetObjectField(this, obj, fieldID, value); }
-    void SetBooleanField(jobject obj, jfieldID fieldID, jboolean value)
-    { functions->SetBooleanField(this, obj, fieldID, value); }
-    void SetByteField(jobject obj, jfieldID fieldID, jbyte value)
-    { functions->SetByteField(this, obj, fieldID, value); }
-    void SetCharField(jobject obj, jfieldID fieldID, jchar value)
-    { functions->SetCharField(this, obj, fieldID, value); }
-    void SetShortField(jobject obj, jfieldID fieldID, jshort value)
-    { functions->SetShortField(this, obj, fieldID, value); }
-    void SetIntField(jobject obj, jfieldID fieldID, jint value)
-    { functions->SetIntField(this, obj, fieldID, value); }
-    void SetLongField(jobject obj, jfieldID fieldID, jlong value)
-    { functions->SetLongField(this, obj, fieldID, value); }
-    void SetFloatField(jobject obj, jfieldID fieldID, jfloat value)
-    { functions->SetFloatField(this, obj, fieldID, value); }
-    void SetDoubleField(jobject obj, jfieldID fieldID, jdouble value)
-    { functions->SetDoubleField(this, obj, fieldID, value); }
-
-    jmethodID GetStaticMethodID(jclass clazz, const char* name, const char* sig)
-    { return functions->GetStaticMethodID(this, clazz, name, sig); }
-
-#define CALL_STATIC_TYPE_METHOD(_jtype, _jname)                             \
-    _jtype CallStatic##_jname##Method(jclass clazz, jmethodID methodID,     \
-        ...)                                                                \
-    {                                                                       \
-        _jtype result;                                                      \
-        va_list args;                                                       \
-        va_start(args, methodID);                                           \
-        result = functions->CallStatic##_jname##MethodV(this, clazz,        \
-                    methodID, args);                                        \
-        va_end(args);                                                       \
-        return result;                                                      \
-    }
-#define CALL_STATIC_TYPE_METHODV(_jtype, _jname)                            \
-    _jtype CallStatic##_jname##MethodV(jclass clazz, jmethodID methodID,    \
-        va_list args)                                                       \
-    { return functions->CallStatic##_jname##MethodV(this, clazz, methodID,  \
-        args); }
-#define CALL_STATIC_TYPE_METHODA(_jtype, _jname)                            \
-    _jtype CallStatic##_jname##MethodA(jclass clazz, jmethodID methodID,    \
-        jvalue* args)                                                       \
-    { return functions->CallStatic##_jname##MethodA(this, clazz, methodID,  \
-        args); }
-
-#define CALL_STATIC_TYPE(_jtype, _jname)                                    \
-    CALL_STATIC_TYPE_METHOD(_jtype, _jname)                                 \
-    CALL_STATIC_TYPE_METHODV(_jtype, _jname)                                \
-    CALL_STATIC_TYPE_METHODA(_jtype, _jname)
-
-    CALL_STATIC_TYPE(jobject, Object)
-    CALL_STATIC_TYPE(jboolean, Boolean)
-    CALL_STATIC_TYPE(jbyte, Byte)
-    CALL_STATIC_TYPE(jchar, Char)
-    CALL_STATIC_TYPE(jshort, Short)
-    CALL_STATIC_TYPE(jint, Int)
-    CALL_STATIC_TYPE(jlong, Long)
-    CALL_STATIC_TYPE(jfloat, Float)
-    CALL_STATIC_TYPE(jdouble, Double)
-
-    void CallStaticVoidMethod(jclass clazz, jmethodID methodID, ...)
-    {
-        va_list args;
-        va_start(args, methodID);
-        functions->CallStaticVoidMethodV(this, clazz, methodID, args);
-        va_end(args);
-    }
-    void CallStaticVoidMethodV(jclass clazz, jmethodID methodID, va_list args)
-    { functions->CallStaticVoidMethodV(this, clazz, methodID, args); }
-    void CallStaticVoidMethodA(jclass clazz, jmethodID methodID, jvalue* args)
-    { functions->CallStaticVoidMethodA(this, clazz, methodID, args); }
-
-    jfieldID GetStaticFieldID(jclass clazz, const char* name, const char* sig)
-    { return functions->GetStaticFieldID(this, clazz, name, sig); }
-
-    jobject GetStaticObjectField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticObjectField(this, clazz, fieldID); }
-    jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticBooleanField(this, clazz, fieldID); }
-    jbyte GetStaticByteField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticByteField(this, clazz, fieldID); }
-    jchar GetStaticCharField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticCharField(this, clazz, fieldID); }
-    jshort GetStaticShortField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticShortField(this, clazz, fieldID); }
-    jint GetStaticIntField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticIntField(this, clazz, fieldID); }
-    jlong GetStaticLongField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticLongField(this, clazz, fieldID); }
-    jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticFloatField(this, clazz, fieldID); }
-    jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID)
-    { return functions->GetStaticDoubleField(this, clazz, fieldID); }
-
-    void SetStaticObjectField(jclass clazz, jfieldID fieldID, jobject value)
-    { functions->SetStaticObjectField(this, clazz, fieldID, value); }
-    void SetStaticBooleanField(jclass clazz, jfieldID fieldID, jboolean value)
-    { functions->SetStaticBooleanField(this, clazz, fieldID, value); }
-    void SetStaticByteField(jclass clazz, jfieldID fieldID, jbyte value)
-    { functions->SetStaticByteField(this, clazz, fieldID, value); }
-    void SetStaticCharField(jclass clazz, jfieldID fieldID, jchar value)
-    { functions->SetStaticCharField(this, clazz, fieldID, value); }
-    void SetStaticShortField(jclass clazz, jfieldID fieldID, jshort value)
-    { functions->SetStaticShortField(this, clazz, fieldID, value); }
-    void SetStaticIntField(jclass clazz, jfieldID fieldID, jint value)
-    { functions->SetStaticIntField(this, clazz, fieldID, value); }
-    void SetStaticLongField(jclass clazz, jfieldID fieldID, jlong value)
-    { functions->SetStaticLongField(this, clazz, fieldID, value); }
-    void SetStaticFloatField(jclass clazz, jfieldID fieldID, jfloat value)
-    { functions->SetStaticFloatField(this, clazz, fieldID, value); }
-    void SetStaticDoubleField(jclass clazz, jfieldID fieldID, jdouble value)
-    { functions->SetStaticDoubleField(this, clazz, fieldID, value); }
-
-    jstring NewString(const jchar* unicodeChars, jsize len)
-    { return functions->NewString(this, unicodeChars, len); }
-
-    jsize GetStringLength(jstring string)
-    { return functions->GetStringLength(this, string); }
-
-    const jchar* GetStringChars(jstring string, jboolean* isCopy)
-    { return functions->GetStringChars(this, string, isCopy); }
-
-    void ReleaseStringChars(jstring string, const jchar* chars)
-    { functions->ReleaseStringChars(this, string, chars); }
-
-    jstring NewStringUTF(const char* bytes)
-    { return functions->NewStringUTF(this, bytes); }
-
-    jsize GetStringUTFLength(jstring string)
-    { return functions->GetStringUTFLength(this, string); }
-
-    const char* GetStringUTFChars(jstring string, jboolean* isCopy)
-    { return functions->GetStringUTFChars(this, string, isCopy); }
-
-    void ReleaseStringUTFChars(jstring string, const char* utf)
-    { functions->ReleaseStringUTFChars(this, string, utf); }
-
-    jsize GetArrayLength(jarray array)
-    { return functions->GetArrayLength(this, array); }
-
-    jobjectArray NewObjectArray(jsize length, jclass elementClass,
-        jobject initialElement)
-    { return functions->NewObjectArray(this, length, elementClass,
-        initialElement); }
-
-    jobject GetObjectArrayElement(jobjectArray array, jsize index)
-    { return functions->GetObjectArrayElement(this, array, index); }
-
-    void SetObjectArrayElement(jobjectArray array, jsize index, jobject value)
-    { functions->SetObjectArrayElement(this, array, index, value); }
-
-    jbooleanArray NewBooleanArray(jsize length)
-    { return functions->NewBooleanArray(this, length); }
-    jbyteArray NewByteArray(jsize length)
-    { return functions->NewByteArray(this, length); }
-    jcharArray NewCharArray(jsize length)
-    { return functions->NewCharArray(this, length); }
-    jshortArray NewShortArray(jsize length)
-    { return functions->NewShortArray(this, length); }
-    jintArray NewIntArray(jsize length)
-    { return functions->NewIntArray(this, length); }
-    jlongArray NewLongArray(jsize length)
-    { return functions->NewLongArray(this, length); }
-    jfloatArray NewFloatArray(jsize length)
-    { return functions->NewFloatArray(this, length); }
-    jdoubleArray NewDoubleArray(jsize length)
-    { return functions->NewDoubleArray(this, length); }
-
-    jboolean* GetBooleanArrayElements(jbooleanArray array, jboolean* isCopy)
-    { return functions->GetBooleanArrayElements(this, array, isCopy); }
-    jbyte* GetByteArrayElements(jbyteArray array, jboolean* isCopy)
-    { return functions->GetByteArrayElements(this, array, isCopy); }
-    jchar* GetCharArrayElements(jcharArray array, jboolean* isCopy)
-    { return functions->GetCharArrayElements(this, array, isCopy); }
-    jshort* GetShortArrayElements(jshortArray array, jboolean* isCopy)
-    { return functions->GetShortArrayElements(this, array, isCopy); }
-    jint* GetIntArrayElements(jintArray array, jboolean* isCopy)
-    { return functions->GetIntArrayElements(this, array, isCopy); }
-    jlong* GetLongArrayElements(jlongArray array, jboolean* isCopy)
-    { return functions->GetLongArrayElements(this, array, isCopy); }
-    jfloat* GetFloatArrayElements(jfloatArray array, jboolean* isCopy)
-    { return functions->GetFloatArrayElements(this, array, isCopy); }
-    jdouble* GetDoubleArrayElements(jdoubleArray array, jboolean* isCopy)
-    { return functions->GetDoubleArrayElements(this, array, isCopy); }
-
-    void ReleaseBooleanArrayElements(jbooleanArray array, jboolean* elems,
-        jint mode)
-    { functions->ReleaseBooleanArrayElements(this, array, elems, mode); }
-    void ReleaseByteArrayElements(jbyteArray array, jbyte* elems,
-        jint mode)
-    { functions->ReleaseByteArrayElements(this, array, elems, mode); }
-    void ReleaseCharArrayElements(jcharArray array, jchar* elems,
-        jint mode)
-    { functions->ReleaseCharArrayElements(this, array, elems, mode); }
-    void ReleaseShortArrayElements(jshortArray array, jshort* elems,
-        jint mode)
-    { functions->ReleaseShortArrayElements(this, array, elems, mode); }
-    void ReleaseIntArrayElements(jintArray array, jint* elems,
-        jint mode)
-    { functions->ReleaseIntArrayElements(this, array, elems, mode); }
-    void ReleaseLongArrayElements(jlongArray array, jlong* elems,
-        jint mode)
-    { functions->ReleaseLongArrayElements(this, array, elems, mode); }
-    void ReleaseFloatArrayElements(jfloatArray array, jfloat* elems,
-        jint mode)
-    { functions->ReleaseFloatArrayElements(this, array, elems, mode); }
-    void ReleaseDoubleArrayElements(jdoubleArray array, jdouble* elems,
-        jint mode)
-    { functions->ReleaseDoubleArrayElements(this, array, elems, mode); }
-
-    void GetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
-        jboolean* buf)
-    { functions->GetBooleanArrayRegion(this, array, start, len, buf); }
-    void GetByteArrayRegion(jbyteArray array, jsize start, jsize len,
-        jbyte* buf)
-    { functions->GetByteArrayRegion(this, array, start, len, buf); }
-    void GetCharArrayRegion(jcharArray array, jsize start, jsize len,
-        jchar* buf)
-    { functions->GetCharArrayRegion(this, array, start, len, buf); }
-    void GetShortArrayRegion(jshortArray array, jsize start, jsize len,
-        jshort* buf)
-    { functions->GetShortArrayRegion(this, array, start, len, buf); }
-    void GetIntArrayRegion(jintArray array, jsize start, jsize len,
-        jint* buf)
-    { functions->GetIntArrayRegion(this, array, start, len, buf); }
-    void GetLongArrayRegion(jlongArray array, jsize start, jsize len,
-        jlong* buf)
-    { functions->GetLongArrayRegion(this, array, start, len, buf); }
-    void GetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
-        jfloat* buf)
-    { functions->GetFloatArrayRegion(this, array, start, len, buf); }
-    void GetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
-        jdouble* buf)
-    { functions->GetDoubleArrayRegion(this, array, start, len, buf); }
-
-    void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
-        const jboolean* buf)
-    { functions->SetBooleanArrayRegion(this, array, start, len, buf); }
-    void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
-        const jbyte* buf)
-    { functions->SetByteArrayRegion(this, array, start, len, buf); }
-    void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
-        const jchar* buf)
-    { functions->SetCharArrayRegion(this, array, start, len, buf); }
-    void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
-        const jshort* buf)
-    { functions->SetShortArrayRegion(this, array, start, len, buf); }
-    void SetIntArrayRegion(jintArray array, jsize start, jsize len,
-        const jint* buf)
-    { functions->SetIntArrayRegion(this, array, start, len, buf); }
-    void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
-        const jlong* buf)
-    { functions->SetLongArrayRegion(this, array, start, len, buf); }
-    void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
-        const jfloat* buf)
-    { functions->SetFloatArrayRegion(this, array, start, len, buf); }
-    void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
-        const jdouble* buf)
-    { functions->SetDoubleArrayRegion(this, array, start, len, buf); }
-
-    jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,
-        jint nMethods)
-    { return functions->RegisterNatives(this, clazz, methods, nMethods); }
-
-    jint UnregisterNatives(jclass clazz)
-    { return functions->UnregisterNatives(this, clazz); }
-
-    jint MonitorEnter(jobject obj)
-    { return functions->MonitorEnter(this, obj); }
-
-    jint MonitorExit(jobject obj)
-    { return functions->MonitorExit(this, obj); }
-
-    jint GetJavaVM(JavaVM** vm)
-    { return functions->GetJavaVM(this, vm); }
-
-    void GetStringRegion(jstring str, jsize start, jsize len, jchar* buf)
-    { functions->GetStringRegion(this, str, start, len, buf); }
-
-    void GetStringUTFRegion(jstring str, jsize start, jsize len, char* buf)
-    { return functions->GetStringUTFRegion(this, str, start, len, buf); }
-
-    void* GetPrimitiveArrayCritical(jarray array, jboolean* isCopy)
-    { return functions->GetPrimitiveArrayCritical(this, array, isCopy); }
-
-    void ReleasePrimitiveArrayCritical(jarray array, void* carray, jint mode)
-    { functions->ReleasePrimitiveArrayCritical(this, array, carray, mode); }
-
-    const jchar* GetStringCritical(jstring string, jboolean* isCopy)
-    { return functions->GetStringCritical(this, string, isCopy); }
-
-    void ReleaseStringCritical(jstring string, const jchar* carray)
-    { functions->ReleaseStringCritical(this, string, carray); }
-
-    jweak NewWeakGlobalRef(jobject obj)
-    { return functions->NewWeakGlobalRef(this, obj); }
-
-    void DeleteWeakGlobalRef(jweak obj)
-    { functions->DeleteWeakGlobalRef(this, obj); }
-
-    jboolean ExceptionCheck()
-    { return functions->ExceptionCheck(this); }
-
-    jobject NewDirectByteBuffer(void* address, jlong capacity)
-    { return functions->NewDirectByteBuffer(this, address, capacity); }
-
-    void* GetDirectBufferAddress(jobject buf)
-    { return functions->GetDirectBufferAddress(this, buf); }
-
-    jlong GetDirectBufferCapacity(jobject buf)
-    { return functions->GetDirectBufferCapacity(this, buf); }
-
-    /* added in JNI 1.6 */
-    jobjectRefType GetObjectRefType(jobject obj)
-    { return functions->GetObjectRefType(this, obj); }
-#endif /*__cplusplus*/
-};
-
-
-/*
- * JNI invocation interface.
- */
-struct JNIInvokeInterface {
-    void*       reserved0;
-    void*       reserved1;
-    void*       reserved2;
-
-    jint        (*DestroyJavaVM)(JavaVM*);
-    jint        (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);
-    jint        (*DetachCurrentThread)(JavaVM*);
-    jint        (*GetEnv)(JavaVM*, void**, jint);
-    jint        (*AttachCurrentThreadAsDaemon)(JavaVM*, JNIEnv**, void*);
-};
-
-/*
- * C++ version.
- */
-struct _JavaVM {
-    const struct JNIInvokeInterface* functions;
-
-#if defined(__cplusplus)
-    jint DestroyJavaVM()
-    { return functions->DestroyJavaVM(this); }
-    jint AttachCurrentThread(JNIEnv** p_env, void* thr_args)
-    { return functions->AttachCurrentThread(this, p_env, thr_args); }
-    jint DetachCurrentThread()
-    { return functions->DetachCurrentThread(this); }
-    jint GetEnv(void** env, jint version)
-    { return functions->GetEnv(this, env, version); }
-    jint AttachCurrentThreadAsDaemon(JNIEnv** p_env, void* thr_args)
-    { return functions->AttachCurrentThreadAsDaemon(this, p_env, thr_args); }
-#endif /*__cplusplus*/
-};
-
-struct JavaVMAttachArgs {
-    jint        version;    /* must be >= JNI_VERSION_1_2 */
-    const char* name;       /* NULL or name of thread as modified UTF-8 str */
-    jobject     group;      /* global ref of a ThreadGroup object, or NULL */
-};
-typedef struct JavaVMAttachArgs JavaVMAttachArgs;
-
-/*
- * JNI 1.2+ initialization.  (As of 1.6, the pre-1.2 structures are no
- * longer supported.)
- */
-typedef struct JavaVMOption {
-    const char* optionString;
-    void*       extraInfo;
-} JavaVMOption;
-
-typedef struct JavaVMInitArgs {
-    jint        version;    /* use JNI_VERSION_1_2 or later */
-
-    jint        nOptions;
-    JavaVMOption* options;
-    jboolean    ignoreUnrecognized;
-} JavaVMInitArgs;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
- * VM initialization functions.
- *
- * Note these are the only symbols exported for JNI by the VM.
- */
-jint JNI_GetDefaultJavaVMInitArgs(void*);
-jint JNI_CreateJavaVM(JavaVM**, JNIEnv**, void*);
-jint JNI_GetCreatedJavaVMs(JavaVM**, jsize, jsize*);
-
-#define JNIIMPORT
-#define JNIEXPORT  __attribute__ ((visibility ("default")))
-#define JNICALL
-
-/*
- * Prototypes for functions exported by loadable shared libs.  These are
- * called by JNI, not provided by JNI.
- */
-JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved);
-JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-/*
- * Manifest constants.
- */
-#define JNI_FALSE   0
-#define JNI_TRUE    1
-
-#define JNI_VERSION_1_1 0x00010001
-#define JNI_VERSION_1_2 0x00010002
-#define JNI_VERSION_1_4 0x00010004
-#define JNI_VERSION_1_6 0x00010006
-
-#define JNI_OK          (0)         /* no error */
-#define JNI_ERR         (-1)        /* generic error */
-#define JNI_EDETACHED   (-2)        /* thread detached from the VM */
-#define JNI_EVERSION    (-3)        /* JNI version error */
-
-#define JNI_COMMIT      1           /* copy content, do not free buffer */
-#define JNI_ABORT       2           /* free buffer w/o copying back */
-
-#endif  /* JNI_H_ */
index 885e63a..0990260 100644 (file)
@@ -120,7 +120,7 @@ ifeq ($(WITH_HOST_DALVIK),true)
     # Build as a WHOLE static library so dependencies are available at link
     # time. When building this target as a regular static library, certain
     # dependencies like expat are not found by the linker.
-    LOCAL_WHOLE_STATIC_LIBRARIES += libexpat libcutils libdex liblog libnativehelper libz
+    LOCAL_WHOLE_STATIC_LIBRARIES += libexpat libcutils libdex liblog libz
 
     # The libffi from the source tree should never be used by host builds.
     # The recommendation is that host builds should always either
index 09470f9..48cc6c1 100644 (file)
@@ -1407,6 +1407,15 @@ std::string dvmStartup(int argc, const char* const argv[],
     return "";
 }
 
+static void loadJniLibrary(const char* name) {
+    std::string mappedName(StringPrintf(OS_SHARED_LIB_FORMAT_STR, name));
+    char* reason = NULL;
+    if (!dvmLoadNativeCode(mappedName.c_str(), NULL, &reason)) {
+        ALOGE("dvmLoadNativeCode failed for \"%s\": %s", name, reason);
+        dvmAbort();
+    }
+}
+
 /*
  * Register java.* natives from our class libraries.  We need to do
  * this after we're ready for JNI registration calls, but before we
@@ -1421,20 +1430,18 @@ std::string dvmStartup(int argc, const char* const argv[],
  */
 static bool registerSystemNatives(JNIEnv* pEnv)
 {
-    Thread* self;
+    // Main thread is always first in list.
+    Thread* self = gDvm.threadList;
 
-    /* main thread is always first in list */
-    self = gDvm.threadList;
-
-    /* must set this before allowing JNI-based method registration */
+    // Must set this before allowing JNI-based method registration.
     self->status = THREAD_NATIVE;
 
-    if (jniRegisterSystemMethods(pEnv) < 0) {
-        ALOGE("jniRegisterSystemMethods failed");
-        return false;
-    }
+    // Most JNI libraries can just use System.loadLibrary, but you can't
+    // if you're the library that implements System.loadLibrary!
+    loadJniLibrary("javacore");
+    loadJniLibrary("nativehelper");
 
-    /* back to run mode */
+    // Back to run mode.
     self->status = THREAD_RUNNING;
 
     return true;