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 callbacks
JavaVM * 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();
}