在底层c++生成的子线程中调用Java,需要JniEnv。而这个JniEnv的生成,需要用 AttachCurrentThread方法。
1. 获取JVM,以及静态方法实例 static JavaVM* g_JavaVM = NULL;
static jobject gInterfaceObject;

void initClassHelper(JNIEnv *env, const char *path, jobject *objptr) {
    jclass cls = env->FindClass(path);
    if(!cls) {
        LOGE("initClassHelper: failed to get %s class reference", path);
        return;
    }
    jmethodID constr = env->GetMethodID(cls, "", "()V");
    if(!constr) {
        LOGE("initClassHelper: failed to get %s constructor", path);
        return;
    }
    jobject obj = env->NewObject(cls, constr);
    if(!obj) {
        LOGE("initClassHelper: failed to create a %s object", path);
        return;
    }
    (*objptr) = env->NewGlobalRef(obj);
}


JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved)
{
    g_JavaVM = vm;
    JNIEnv *env = NULL;
int status = g_JavaVM->GetEnv((void **) &env, JNI_VERSION_1_6);
if (status < 0) {
LOGE("get env failure");
return JNI_VERSION_1_6;
}
initClassHelper(env, "com/iptv/epg/Inform", &gInterfaceObject);
    return JNI_VERSION_1_6;
}

根据g_JavaVM可以得到JniEnv,根据gInterfaceObject可以得到相应的class。
2. 在子线程中调用Java方法 下面的代码与1中代码处于不同线程。 JNIEnv *jniEnv = NULL;
bool isAttached = false; //获取env int status = g_JavaVM->GetEnv((void **) &jniEnv, JNI_VERSION_1_6);
if(status < 0) {
__android_log_print(ANDROID_LOG_INFO, "SuIPTV", "[%s] failed to get JNI environment", __FUNCTION__); //如果是在子线程中,应该以AttachCurrentThread获取env status = g_JavaVM->AttachCurrentThread(&jniEnv, NULL);
if(status < 0) {
LOGE("callback_handler: failed to attach current thread");
return;
} else {
isAttached = true;
LOGE("callback_handler: ttach current thread success");
}
//获取对应class
jclass InformProvider = jniEnv->GetObjectClass(gInterfaceObject);
if(!InformProvider) {
LOGE("callback_handler: failed to get class reference");
if(isAttached) g_JavaVM->DetachCurrentThread();
return;
} else {
LOGE("callback_handler: get class reference success");
} //获取静态方法 jmethodID playEnd = jniEnv->GetStaticMethodID(InformProvider, "playEnd","()V");
if(!playEnd) {
LOGE("callback_handler: failed to get method ID");
if(isAttached) g_JavaVM->DetachCurrentThread();
return;
} else {
LOGE("callback_handler: get method ID success");
} //调用Java方法 jniEnv->CallStaticObjectMethod(InformProvider, playEnd);
if(isAttached) g_JavaVM->DetachCurrentThread();
__android_log_print(ANDROID_LOG_INFO, "SuIPTV", "[%s] CallStaticObjectMethod", __FUNCTION__);
3. 被调用的Java方法如下 public class Inform {

public static void playEnd() {

}
}

另外,利用javap生成方法签名: http://www.blogjava.net/lihao336/archive/2011/10/24/361901.html

更多相关文章

  1. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  2. Manifest merger failed : Attribute application@allowBackup v
  3. Android(安卓)GridView之实现单元格合并,以及第一个item点击无响
  4. android集成环信sdk出现app:transformClassesWithDexForDebug.”
  5. android 改变线程优先级Change Thread Priority
  6. Retrofit源码解析(一)
  7. 去除svn中方法
  8. Android(安卓)学习笔记 databinding简单使用:使用databinding在li
  9. android学习日记之fragment

随机推荐

  1. Android(安卓)studio如何使用SVN进行版本
  2. android Toast大全(五种情形)
  3. Android异步AsyncTask二三解
  4. Android(安卓)Service的说明和注意事项
  5. Android中打开网络设置界面
  6. android监控SIM卡状态的广播示例代码
  7. Android(安卓)快速掌握Activity生命周期
  8. 关于Studio和EclipseSHA1值的查看
  9. android 只定义下边边框
  10. Android数据通信开发与应用(四):实战开发