c++ 子线程里面调用 Android 代码

来源:互联网 发布:ios更新后数据还在吗 编辑:程序博客网 时间:2024/05/16 04:48

c++ 子线程里面调用 Android 代码

本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

  • “抄袭“地址:http://adamish.com/blog/archives/327
    我写的时候发现原来作者的代码有点小问题,稍稍修改了下

代码块

代码块语法遵循标准markdown代码,例如:

package com.adamish;public class Foo {  public native void register();  public void callback(int val) {    // do stuff  }}
// cached refs for later callbacksJavaVM * g_vm;jobject g_obj;jmethodID g_mid;JNIEXPORT jboolean JNICALL Java_com_adamish_Foo_register    (JNIEnv * env, jobject obj, jlong hwnd) {                bool returnValue = true;        // convert local to global reference                 // (local will die after this method call)        env->GetJavaVM(&g_vm);        g_obj = env->NewGlobalRef(obj);        // save refs for callback        jclass g_clazz = env->GetObjectClass(g_obj);        if (g_clazz == NULL) {            std::cout << "Failed to find class" << std::endl;        }        g_mid = env->GetMethodID(g_clazz, "callback", "(I)V");        if (g_mid == NULL) {            std::cout << "Unable to get method ref" << std::endl;        }        return (jboolean)returnValue;}
void callback(int val) {    JNIEnv * g_env;    // double check its all ok    int getEnvStat = g_vm->GetEnv((void **)&g_env, JNI_VERSION_1_6);    if (getEnvStat == JNI_EDETACHED) {        std::cout << "GetEnv: not attached" << std::endl;        if(g_vm->AttachCurrentThread(&g_env,NULL)!=0){            std::cout << "Failed to attach" << std::endl;        }    } else if (getEnvStat == JNI_OK) {        //    } else if (getEnvStat == JNI_EVERSION) {        std::cout << "GetEnv: version not supported" << std::endl;    }    g_env->CallVoidMethod(g_obj, g_mid, val);    if (g_env->ExceptionCheck()) {        g_env->ExceptionDescribe();    }    g_vm->DetachCurrentThread();}