此文章基于JNI方法使用--C++项目如何访问Java接口(一)_闪闪加油干(◍>∇<◍)ノ゙的博客-CSDN博客
本文换一种方式,主要讲的是如何获取到上下文Context。
由于网上很多文章讲的都是通过ActivityThread获取当前的Context,且文章很老,不适配新的安卓版本,我本地通过测试,FindClass根本找不到ActivityThread,所以才写了此文章。
以获取AudioManager为例,讲解如下。
由于是Native项目,所以应用启动后会调用android_main函数,可以在项目中,在这个函数中,一般会对初始化JVM.
void android_main(struct android_app* app) {
JNIEnv* Env;
//Env赋值
app->activity->vm->AttachCurrentThread(&Env, nullptr);
app->userData = &appState;
app->onAppCmd = app_handle_cmd;
jobject activityInstance = app->activity->clazz;
JavaVM* jvm = app->activity->vm;
Java方式是:
//AudioManager mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
下面会讲出来getContext()是如何获取到的。
对应的C++实现是:
jclass Context = Env->FindClass("android/content/Context");
jmethodID getSystemService = Env->GetMethodID(Context, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
jstring audio = Env->NewStringUTF("audio");
__android_log_print(ANDROID_LOG_DEBUG, "shanshan", "getSystemService");//获取到了AudioManagerService,其返回值就是AudioManager
//第一个入参activityInstance就是当前的Context
jobject audioManagerService = Env->CallObjectMethod(activityInstance, getSystemService, audio);