android jni 开发callback 传递参数

    在android JNI开发中我们经常要在C中调用JAVA的程序,比如设计一个回调函数实现java与C之间的数据传递。

在设计car-eye-player android版本的时候遇到这样的问题,记录一下。其中C中的callback调用代码如下:

void callback(int channel)
{
JNIEnv *env;
   int mNeedDetach = -1;
   //获取当前native线程是否有没有被附加到jvm环境中
   int getEnvStat = (*g_VM)->GetEnv(g_VM, (void **) &env,JNI_VERSION_1_6);
   if (getEnvStat == JNI_EDETACHED) {
       //如果没有, 主动附加到jvm环境中,获取到env
       if ((*g_VM)->AttachCurrentThread(g_VM, &env, NULL) != 0) {
           return;
       }
       mNeedDetach = JNI_TRUE;
   }
   //通过全局变量g_obj 获取到要回调的类
   jclass javaClass = (*env)->GetObjectClass(env, g_obj);
   if (javaClass == 0) {
      // LOGI("Unable to find class");
       (*g_VM)->DetachCurrentThread(g_VM);
       return;
   }
   //获取要回调的方法ID
   jmethodID javaCallbackId = (*env)->GetMethodID(env, javaClass,
                                                  "CarEyeCallBack", "(III)V");
   if (javaCallbackId == NULL) {
       //LOGI("Unable to find method:onProgressCallBack");
       return;
   }
   (*env)->CallIntMethod(env, g_obj, javaCallbackId,0,channel);
   //释放当前线程
if(mNeedDetach) {
(*g_VM)->DetachCurrentThread(g_VM);
}
   env = NULL;
}

CarEyeCallBack 是我们需要调用的函数。

private   void onSourceCallBack(int _channelPtr int _channelId, int _channelPtr)

{

    。。。。。

}

实现了callback函数调用。

有关详细代码下载可访问:https://github.com/Car-eye-team 技术交流QQ群:590411159





你可能感兴趣的:(流媒体)