JNI方法使用--C++项目如何访问Java接口(二)

此文章基于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);

猜你喜欢

转载自blog.csdn.net/weixin_41028555/article/details/132468774
今日推荐