在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