Android JNI开发C调用Java 层方法

问题:Android Studio3.0 JNI开发中C调用Java层的方法,起到回调函数的作用。

编译运行正确的写法:

java层:

public void callInstanceMethod(byte[] str)
{
    videoStream = str;
    Log.i("Stringisisisisis", ""+videoStream.length);
}

JNI中的.C方法中调用上面所写的方法:

void cbf_stream_data(void *UsrHandle, int Sid, int StreamIdx, int DataType, char *Data, int DataLen)
{
    DBG_INFO("Sid:%d, StreamIdx:%d, type:%d, datalen:%d", Sid, StreamIdx, DataType, DataLen);

    JNIEnv *env = (JNIEnv *)UsrHandle;

    jclass clazz = NULL;
    jobject jobj = NULL;
    jmethodID mid_construct = NULL;
    jmethodID mid_instance = NULL;
    jstring str_arg = NULL;
    // 1.从classpath路径下搜索ClassMethod这个类,并返回该类的class对象
    clazz = (*env)->FindClass(env, "com/jnidemoactivity/MainActivity");

    if (NULL == clazz)
    {
        printf("找不到'com.jnidemoactivity.MainActivity'这个类");
        return;
    }

    // 2、获取类的默认构造方法ID
    mid_construct = (*env)->GetMethodID(env,clazz, "<init>","()V");
    if (mid_construct == NULL) {
        printf("找不到默认的构造方法");
        return;
    }

    // 3、查找实例方法的ID
    mid_instance = (*env)->GetMethodID(env, clazz, "callInstanceMethod", "([B)V");
    if (mid_instance == NULL) {

        return;
    }

    // 4、创建该类的实例
    jobj = (*env)->NewObject(env,clazz,mid_construct);
    if (jobj == NULL) {
        printf("在com.study.jnilearn.ClassMethod类中找不到callInstanceMethod方法");
        return;
    }

    // 5、调用对象的实例方法
    jbyteArray jarray = (*env)->NewByteArray(env, DataLen);
    (*env)->SetByteArrayRegion(env, jarray, 0, DataLen, Data);

    (*env)->CallVoidMethod(env,jobj,mid_instance,jarray,200);

    // 删除局部引用
    (*env)->DeleteLocalRef(env,clazz);
    (*env)->DeleteLocalRef(env,jobj);
    (*env)->DeleteLocalRef(env,str_arg);
}

运行结果:上面写的jarray的长度。



猜你喜欢

转载自blog.csdn.net/m782008517/article/details/79067434