您的位置:首页 > 移动开发 > Android开发

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

2017-09-06 17:28 344 查看

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息