/* //device/libs/android_runtime/android_debug_JNITest.cpp
**
** Copyright 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 "DebugJNI"

#include "jni.h"
#include "nativehelper/JNIHelp.h"
#include "utils/Log.h"
#include "utils/misc.h"
//#include "android_runtime/AndroidRuntime.h"

namespace android {

/*
 * Implements:
 *  native int part1(int intArg, double doubleArg, String stringArg,
 *      int[] arrayArg)
 */
static jint android_debug_JNITest_part1(JNIEnv* env, jobject object,
    jint intArg, jdouble doubleArg, jstring stringArg, jobjectArray arrayArg)
{
    jclass clazz;
    jmethodID part2id;
    jsize arrayLen;
    jint arrayVal;
    int result = -2;

    ALOGI("JNI test: in part1, intArg=%d, doubleArg=%.3f\n", intArg, doubleArg);

    /* find "int part2(double doubleArg, int fromArray, String stringArg)" */
    clazz = env->GetObjectClass(object);
    part2id = env->GetMethodID(clazz,
                "part2", "(DILjava/lang/String;)I");
    if (part2id == NULL) {
        LOGE("JNI test: unable to find part2\n");
        return -1;
    }

    /* get the length of the array */
    arrayLen = env->GetArrayLength(arrayArg);
    ALOGI("  array size is %d\n", arrayLen);

    /*
     * Get the last element in the array.
     * Use the Get<type>ArrayElements functions instead if you need access
     * to multiple elements.
     */
    arrayVal = (int) env->GetObjectArrayElement(arrayArg, arrayLen-1);
    ALOGI("  array val is %d\n", arrayVal);

    /* call this->part2 */
    result = env->CallIntMethod(object, part2id,
        doubleArg, arrayVal, stringArg);

    return result;
}

/*
 * Implements:
 *  private static native int part3(String stringArg);
 */
static jint android_debug_JNITest_part3(JNIEnv* env, jclass clazz,
    jstring stringArg)
{
    const char* utfChars;
    jboolean isCopy;

    ALOGI("JNI test: in part3\n");

    utfChars = env->GetStringUTFChars(stringArg, &isCopy);

    ALOGI("  String is '%s', isCopy=%d\n", (const char*) utfChars, isCopy);

    env->ReleaseStringUTFChars(stringArg, utfChars);

    return 2000;
}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */
    { "part1",      "(IDLjava/lang/String;[I)I",
            (void*) android_debug_JNITest_part1 },
    { "part3",      "(Ljava/lang/String;)I",
            (void*) android_debug_JNITest_part3 },
};
int register_android_debug_JNITest(JNIEnv* env)
{
    return jniRegisterNativeMethods(env, "android/debug/JNITest",
        gMethods, NELEM(gMethods));
}

#if 0
/* trampoline into C++ */
extern "C"
int register_android_debug_JNITest_C(JNIEnv* env)
{
    return android::register_android_debug_JNITest(env);
}
#endif

}; // namespace android

