// // Created by lilin on 2019-12-10. // #include "JavaListener.h" JavaListener::JavaListener(JavaVM *vm, _JNIEnv *env, jobject obj) { jvm=vm; jenv=env; jobj = obj; jclass cls= env->GetObjectClass(obj); if(!cls){return;} jmid_state= env->GetMethodID( cls,"c_bareState","(Ljava/lang/String;)V"); jmid_codec= env->GetMethodID( cls,"c_bareCodec","(Ljava/lang/String;)V"); jmid_vstart= env->GetMethodID( cls,"c_bareVstart","()V"); jmid_vstop= env->GetMethodID( cls,"c_bareVstop","()V"); jmid_vdata= env->GetMethodID( cls,"c_renderYUV","(II[B[B[B)V"); } JavaListener::~JavaListener() { } void JavaListener::onBaresipState(const char *msg) { /**if( threadtype==0 ){ jstring jmsg= jenv->NewStringUTF(msg); jenv->CallVoidMethod(jobj,jmid_state,jmsg); jenv->DeleteLocalRef(jmsg); }else{ JNIEnv *env1;LOGE("1xxxxxxxxxx"); jint res= jvm->AttachCurrentThread(&env1,0);LOGE("2xxxxxxxxxx"); jstring jmsg= env1->NewStringUTF(msg);LOGE("3xxxxxxxxxx"); env1->CallVoidMethod(jobj,jmid_state,jmsg);LOGE("4xxxxxxxxxx"); env1->DeleteLocalRef(jmsg);LOGE("4exxxxxxxxxx*=%d=",res); if (JNI_OK == res) {LOGE("5exxxxxxxxxx1"); jvm->DetachCurrentThread();LOGE("5exxxxxxxxxx2"); }LOGE("6exxxxxxxxxx"); }**/ JNIEnv *env1; bool needDetach = false; if (jvm->GetEnv((void**) &env1, JNI_VERSION_1_6) != JNI_OK) { jvm->AttachCurrentThread(&env1,0); needDetach = true; } jstring jmsg= env1->NewStringUTF(msg); env1->CallVoidMethod(jobj,jmid_state,jmsg); env1->DeleteLocalRef(jmsg); if (needDetach) { jvm->DetachCurrentThread(); } } void JavaListener::onBaresipCodec(const char *msg) { /** if( threadtype==0 ){ jstring jmsg= jenv->NewStringUTF(msg); jenv->CallVoidMethod(jobj,jmid_codec,jmsg); jenv->DeleteLocalRef(jmsg); }else{ JNIEnv *env1; jvm->AttachCurrentThread(&env1,0); jstring jmsg= env1->NewStringUTF(msg); env1->CallVoidMethod(jobj,jmid_codec,jmsg); env1->DeleteLocalRef(jmsg); jvm->DetachCurrentThread(); }**/ JNIEnv *env1; bool needDetach = false; if (jvm->GetEnv((void**) &env1, JNI_VERSION_1_6) != JNI_OK) { jvm->AttachCurrentThread(&env1,0); needDetach = true; } jstring jmsg= env1->NewStringUTF(msg); env1->CallVoidMethod(jobj,jmid_codec,jmsg); env1->DeleteLocalRef(jmsg); if (needDetach) { jvm->DetachCurrentThread(); } } void JavaListener::onBaresipVstart() { /**if( threadtype==0 ){ jenv->CallVoidMethod(jobj,jmid_vstart); }else{ JNIEnv *env1; jvm->AttachCurrentThread(&env1,0); env1->CallVoidMethod(jobj,jmid_vstart); jvm->DetachCurrentThread(); }**/ JNIEnv *env1; bool needDetach = false; if (jvm->GetEnv((void**) &env1, JNI_VERSION_1_6) != JNI_OK) { jvm->AttachCurrentThread(&env1,0); needDetach = true; } env1->CallVoidMethod(jobj,jmid_vstart); if (needDetach) { jvm->DetachCurrentThread(); } } void JavaListener::onBaresipVstop() { /**if( threadtype==0 ){ jenv->CallVoidMethod(jobj,jmid_vstop); }else{ JNIEnv *env1; jvm->AttachCurrentThread(&env1,0); env1->CallVoidMethod(jobj,jmid_vstop); jvm->DetachCurrentThread(); }**/ JNIEnv *env1; bool needDetach = false; if (jvm->GetEnv((void**) &env1, JNI_VERSION_1_6) != JNI_OK) { jvm->AttachCurrentThread(&env1,0); needDetach = true; } env1->CallVoidMethod(jobj,jmid_vstop); if (needDetach) { jvm->DetachCurrentThread(); } } void JavaListener::onBaresipVyuv(int width, int height, uint8_t *fy, uint8_t *fu, uint8_t *fv) { /** if( threadtype==0 ){ }else{ JNIEnv *env1; jvm->AttachCurrentThread(&env1,0); jclass cls= env1->GetObjectClass(jobj); if(!cls){return;} jbyteArray y = env1->NewByteArray(width * height); env1->SetByteArrayRegion(y, 0, width * height, (const jbyte *)(fy)); jbyteArray u = env1->NewByteArray(width * height / 4); env1->SetByteArrayRegion(u, 0, width * height / 4, (const jbyte *)(fu) ); jbyteArray v = env1->NewByteArray(width * height / 4); env1->SetByteArrayRegion(v, 0, width * height / 4, (const jbyte *)(fv)); env1->CallVoidMethod(jobj,jmid_vdata ,width, height, y, u, v); env1->DeleteLocalRef(y); env1->DeleteLocalRef(u); env1->DeleteLocalRef(v); jvm->DetachCurrentThread(); }**/ JNIEnv *env1; bool needDetach = false; if (jvm->GetEnv((void**) &env1, JNI_VERSION_1_6) != JNI_OK) { jvm->AttachCurrentThread(&env1,0); needDetach = true; } jbyteArray y = env1->NewByteArray(width * height); env1->SetByteArrayRegion(y, 0, width * height, (const jbyte *)(fy)); jbyteArray u = env1->NewByteArray(width * height / 4); env1->SetByteArrayRegion(u, 0, width * height / 4, (const jbyte *)(fu) ); jbyteArray v = env1->NewByteArray(width * height / 4); env1->SetByteArrayRegion(v, 0, width * height / 4, (const jbyte *)(fv)); env1->CallVoidMethod(jobj,jmid_vdata ,width, height, y, u, v); env1->DeleteLocalRef(y); env1->DeleteLocalRef(u); env1->DeleteLocalRef(v); if (needDetach) { jvm->DetachCurrentThread(); } }