问题: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的长度。