注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

linux 学习

 
 
 

日志

 
 

Android java层调用C层原理  

2012-07-25 13:53:03|  分类: 安卓 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在 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_lose},

{....... },

};

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();

  评论这张
 
阅读(2194)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017