附录2:SampleCode

#include <jni.h>
#include <stdio.h>
#include <errno.h>

//com/ex/Foo.java

/* Native function */
JNIEXPRORT jboolean JNICALL Java_com_ex_Foo_fooFunc(JNIEnv *env, jobject obj, jint k)
{
    if (k > 0)
        return JNI_TRUE;
    else
        return JNI_FALSE;
}

/* native code call java method */
JNIEXPRORT jboolean JNICALL Java_com_ex_Foo_callJavaFunc(JNIEnv *env, jobject obj, jint k)
{
    jboolean r = JNI_FALSE;
    jclass clazz = (*env)->GetObjectClass(env, obj);
    if (clazz == NULL)
        return r;
    jmethodID mID = (*env)->GetMethodID(env, clazz, "sayHello", "(I)Z");
    if (mID == NULL)
        return r;

    r = (*env)->CallBooleanMethod(env, obj, mID, 1);
    if (ExceptionCheck(env) == JNI_TRUE)
        return JNI_FALSE;
    else
        return r;
}

/**/
void fooPrintString(JNIEnv *env, jobject obj, jstring str)
{
    jchar *jstr = (*env)->GetStringUTFChars(env, str, 0);
    if (jstr == NULL)
        return NULL;

    printf("String from java:%s", jstr);
    (*env)->ReleaseStringUTFChars(env, str, jstr);
}

jint fooGetByteArray(JNIEnv *env, jclass clazz, jbyteArray array)
{
    jint len = (*env)->GetArrayLength(env, array);
    if (len < strlen("Hello Jni") + 1)
        return -1;

    jbyte *buf = (*env)->GetByteArrayElements(env, array, 0);
    if (buf == NULL)
        return -ENOMEM;

    jint r = sprintf(buf, "Hello Jni");
    (*env)->ReleaseByteArrayElements(env, array, buf, 0);
    return r;
}

static JNINativeMethod methods[] = {
    {"fooPrintString", "(Ljava/lang/String;)", (void *)fooPrintString},
    {"fooGetByteArray", "([B)I", (void *)fooGetByteArray},
};

jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
    JNIEnv *env;
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK)
        return JNI_ERR;

    jclass clazz = (*env)->FindClass(env, "com/ex/Foo");
    if (clazz == NULL)
        return JNI_ERR;

    jint len = sizeof(methods) / sizeof(methods[0]);
    (*env)->RegisterNatives(env, clazz, methods, len);

    return JNI_VERSION_1_4;
}