1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
| class MyContext { public: JNIEnv *jniEnv = nullptr; jobject instance = nullptr; };
void *myThreadTaskAction(void *pVoid) { LOGE("myThreadTaskAction run");
MyContext * myContext = static_cast<MyContext *>(pVoid);
JNIEnv * jniEnv = nullptr; jint attachResult = ::jVm->AttachCurrentThread(&jniEnv, nullptr); if (attachResult != JNI_OK) { return 0; }
jclass mainActivityClass = jniEnv->GetObjectClass(myContext->instance);
jmethodID updateActivityUI = jniEnv->GetMethodID(mainActivityClass, "updateActivityUI", "()V");
jniEnv->CallVoidMethod(myContext->instance, updateActivityUI);
::jVm->DetachCurrentThread();
LOGE("C++ 异步线程OK")
return nullptr; }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_naitveThread(JNIEnv *env, jobject job) {
MyContext * myContext = new MyContext; myContext->jniEnv = env; myContext->instance = env->NewGlobalRef(job);
pthread_t pid; pthread_create(&pid, nullptr, myThreadTaskAction, myContext); pthread_join(pid, nullptr); }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_closeThread(JNIEnv *env, jobject thiz) { }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_nativeFun1(JNIEnv *env, jobject job) { JavaVM * javaVm = nullptr; env->GetJavaVM(&javaVm);
LOGE("nativeFun1 当前函数env地址%p, 当前函数jvm地址:%p, 当前函数job地址:%p, JNI_OnLoad的jvm地址:%p\n", env, javaVm, job, ::jVm); }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_nativeFun2(JNIEnv *env, jobject job) { JavaVM * javaVm = nullptr; env->GetJavaVM(&javaVm);
LOGE("nativeFun2 当前函数env地址%p, 当前函数jvm地址:%p, 当前函数job地址:%p, JNI_OnLoad的jvm地址:%p\n", env, javaVm, job, ::jVm); }
void * run(void *) { JNIEnv * newEnv = nullptr; ::jVm->AttachCurrentThread(&newEnv, nullptr);
LOGE("run jvm地址:%p, 当前run函数的newEnv地址:%p \n", ::jVm, newEnv);
::jVm->DetachCurrentThread(); return nullptr; }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_staticFun3(JNIEnv *env, jclass clazz) { JavaVM * javaVm = nullptr; env->GetJavaVM(&javaVm);
LOGE("nativeFun3 当前函数env地址%p, 当前函数jvm地址:%p, 当前函数clazz地址:%p, JNI_OnLoad的jvm地址:%p\n", env, javaVm, clazz, ::jVm);
pthread_t pid; pthread_create(&pid, nullptr, run, nullptr); }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity_staticFun4(JNIEnv *env, jclass clazz) { JavaVM * javaVm = nullptr; env->GetJavaVM(&javaVm);
LOGE("nativeFun4 当前函数env地址%p, 当前函数jvm地址:%p, 当前函数clazz地址:%p, JNI_OnLoad的jvm地址:%p\n", env, javaVm, clazz, ::jVm); }
extern "C" JNIEXPORT void JNICALL Java_com_jack_as_1jni_1project_MainActivity2_nativeFun5(JNIEnv *env, jobject job) { JavaVM * javaVm = nullptr; env->GetJavaVM(&javaVm);
LOGE("nativeFun5 当前函数env地址%p, 当前函数jvm地址:%p, 当前函数job地址:%p, JNI_OnLoad的jvm地址:%p\n", env, javaVm, job, ::jVm); }
|