在android的VM里,可以加载C模块(也就是so库),及通过System.loadLibrary()函数来加载。当加载某个so库时,VM会先执行其实现的JNI_Onload函数。该函数的原型为:exern "c" jint JNI_Onload(JavaVM* vm, void* reserved); 注意每个线程调用这个so库时传入的vm会不同。保证线程安全的代码必须注意对此vm的判断。

于是,我们可以在JNI_Onload函数里进行一些初始化工作,可以向java层注册c层的native函数,实现java层向c层的调用。

利用传入的vm我们可以得到JNIEnv 指针,然后利用jniResiterNativMetheds函数来实现向java层注册C函数。首先定义一个结构:

static JNINativeMethod sMethods[] = {

/*name,signature,funcptr */

{"close","(I)V" ,(void*)android_close},

{....... },

};

return jniRegisterNativeMethods(env,"com/android/server/AlarmService",sMethods,NELEM(sMethods));


然后在C层实现static void android_close(JNIEnv *env, jobject obj)函数。


OK,到这就可以在java的AlarmService类里声明一个这样的函数:

private static native void close();

调用它就进入了该so模块。所有这一切都是android的java虚拟机帮我们完成的。


反之,利用java虚拟机,我们也可以完成从c层回调java层。利用的还是那个很重要的类变量JNIEnv env.

FindClass();

GetMethodID();

CallObjectMethod();

CallStaticObjectMethod();

具体的细节可以参考手册。





更多相关文章

  1. Android新手轻松学知乎日报开发(三)封装简单的OkHttp
  2. libevent 多线程IO
  3. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)
  4. Android(安卓)8.0 行为变更
  5. 吐血总结 2020 Android(安卓)实习面经
  6. 【Android(安卓)NDK 开发】Android.mk 配置动态库 ( Android(安
  7. Android面试题(部分2)
  8. Android(安卓)Kotlin 开发踩坑之旅
  9. 如何分析和研究Log文件

随机推荐

  1. Android(安卓)WebView总结
  2. Android(安卓)读写文件的N种写法
  3. android 按钮Button单击背景切换
  4. android 用VideoView播放本地视频文件
  5. Android(安卓)ViewPager动画第三方库(Magi
  6. [Android]在Android(安卓)google Map中標
  7. 【Android】简单图片浏览器
  8. Android下各文件方法获取的路径
  9. Android应用中使用Popupmenu
  10. android @+id 含义