Android NDK之纯 C 或 C++ 安卓工程NativeActivity------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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值