Android NDK学习(四):C/C++层调用JAVA

一、从C/C++层调用JAVA层代码(无参数调用)

    //在c代码里面调用java代码里面的方法
    // java 反射
    // 1 . 找到java代码的 class文件
    // jclass (*FindClass)(JNIEnv*, const char*);
    jclass dpclazz = (*env)->FindClass(env, "com/renhui/sffmpegandroidstreamer/MainActivity");
    if(dpclazz==0) {
        LOGI("find class error");
        return;
    }
    LOGI("find class ");

    //2. 寻找class里面的方法
    // jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","()V");
    if(method1==0){
        LOGI("find method1 error");
        return;
    }
    LOGI("find method1 ");
    //3. 调用这个方法
    // void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,obj,method1);

二、从C/C++层调用JAVA层代码(传参——字符串)

    //在c代码里面调用java代码里面的方法
    // java 反射
    //1 . 找到java代码的 class文件
    // jclass (*FindClass)(JNIEnv*, const char*);
    jclass dpclazz = (*env)->FindClass(env,"com/renhui/sffmpegandroidstreamer/MainActivity");
    if(dpclazz==0){
        LOGI("find class error");
        return;
    }
    LOGI("find class ");

    //2 寻找class里面的方法
    // jmethodID  (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID method1 = (*env)->GetMethodID(env,dpclazz,"helloFromJava","(Ljava/lang/String;)V");
    if(method1==0){
        LOGI("find method1 error");
        return;
    }
    LOGI("find method1 ");
    //3 .调用这个方法
    // void  (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,obj,method1, (*env)-> NewStringUTF(env, "这是c反射调用java方法" ));
posted @ 2018-03-02 10:13  灰色飘零  阅读(576)  评论(0编辑  收藏  举报