首页 > 技术文章 > JNI 回调小记

toosuo 2014-07-10 15:54 原文

javah在eclipse中设置参数:location(javah.exe的位置)working dir(${project_loc}/src)

-classpath .;./classes -d ${project_loc}\jni -jni ${java_type_name}

回调的java代码

public class HelloWorld {
    static {
        System.loadLibrary("jnidemo");
    }

    public void myCallbackFunc(String nMsg) {
        Log.v("EagleTag", "back message:" + nMsg);
    }

    private void throwException() throws NullPointerException {
        throw new NullPointerException("Null pointer");
    }

    public native String DisplayHello(String inputStr);
}

C代码

jstring JNICALL Java_com_example_jnidemo_HelloWorld_DisplayHello(JNIEnv *env,
        jobject obj, jstring what) {
    const jbyte *l_what;
    char *result;

    l_what = (*env)->GetStringUTFChars(env, what, NULL);
    if (l_what == NULL) {
        return NULL; /* OutOfMemoryError already thrown */
    }

    result = malloc(strlen(l_what) + 6);
    if (result == NULL) {
        return NULL;
    }
    sprintf(result, "中文reiver %s", l_what);

    //回调
    char tChar[256];
    gJniClass = 0;
    gJinMethod = 0;

    gJniClass = (*env)->GetObjectClass(env, obj);
    if (gJniClass == 0 || gJniClass == NULL)
        return (*env)->NewStringUTF(env, "-1");

    gJinMethod = (*env)->GetMethodID(env, gJniClass, "myCallbackFunc",
            "(Ljava/lang/String;)V");
    if (gJinMethod == 0 || gJinMethod == NULL)
        return (*env)->NewStringUTF(env, "-2");

    strcpy(tChar, result);
    (*env)->CallVoidMethod(env, obj, gJinMethod,
            (*env)->NewStringUTF(env, tChar));

    return (*env)->NewStringUTF(env, result);
}

 

推荐阅读