当前位置: 首页 > news >正文

新余 网站建设住房和城乡建设部证书

新余 网站建设,住房和城乡建设部证书,24小时学会网站建设下载,乐山网站开发目录 版本信息#xff1a; 写在前面#xff1a; 源码论证#xff1a; 总结#xff1a; 版本信息#xff1a; jdk版本#xff1a;jdk8u40 写在前面#xff1a; 在Java类库中很多类都有一个registerNatives的native方法#xff0c;并且写在static静态代码块中进行初…目录 版本信息 写在前面 源码论证 总结 版本信息 jdk版本jdk8u40 写在前面 在Java类库中很多类都有一个registerNatives的native方法并且写在static静态代码块中进行初始化调用有不少的读者应该会对这个方法感兴趣但是此方法是一个native方法让不少的读者望而却步所以笔者写在这一篇关于registerNatives方法的文章 要真正弄懂registerNatives方法非常的复杂因为你需要明白 C/C 的执行和动态链接库的原理、以及JVM对于动态链接库的封装处理、以及Java语言作为解释性语言JVM的解释器引擎如何对其做处理、以及JVM对于类加载的一个过程他是如何链接native方法的 这并不是在劝退各位读者而是让读者有一个对知识的认知。当然笔者认为高级的封装是有他的意义存在屏蔽掉底层的各种复杂的实现。所以笔者也会尽量用通俗易懂的方式介绍registerNatives方法 源码论证 首先需要说明白registerNatives这个native方法存在的意义把类中其他native方法的实现映射到JVM虚拟机中内部的方法native方法的实现是c/c语言而JVM也是c语言实现所以是完成一个其他native方法的映射 在JVM的实现Hotspot源码中一般情况下native层面的源码文件命名是跟类名一致比如拿Thread.java 类来说在Hotspot中他的native层面文件就是 Thread.c 。 正好Thread类中也有registerNatives接下来我们就看到Thread中registerNatives方法的native层面源码实现 /src/share/native/java/lang/Thread.c 文件中 typedef struct {char *name;char *signature;void *fnPtr; } JNINativeMethod;static JNINativeMethod methods[] {{start0, ()V, (void *)JVM_StartThread},{stop0, ( OBJ )V, (void *)JVM_StopThread},{isAlive, ()Z, (void *)JVM_IsThreadAlive},{suspend0, ()V, (void *)JVM_SuspendThread},{resume0, ()V, (void *)JVM_ResumeThread},{setPriority0, (I)V, (void *)JVM_SetThreadPriority},{yield, ()V, (void *)JVM_Yield},{sleep, (J)V, (void *)JVM_Sleep},{currentThread, () THD, (void *)JVM_CurrentThread},{countStackFrames, ()I, (void *)JVM_CountStackFrames},{interrupt0, ()V, (void *)JVM_Interrupt},{isInterrupted, (Z)Z, (void *)JVM_IsInterrupted},{holdsLock, ( OBJ )Z, (void *)JVM_HoldsLock},{getThreads, ()[ THD, (void *)JVM_GetAllThreads},{dumpThreads, ([ THD )[[ STE, (void *)JVM_DumpThreads},{setNativeName, ( STR )V, (void *)JVM_SetNativeThreadName}, }; JNINativeMethod结构体定义了native方法的名字、签名、目标方法的地址。在Thread.c 文件中定义了JNINativeMethod结构体数组完成了native方法名和目标方法映射而这些方法名恰好是Thread.java 类中其他native方法这也对应上上文说的  把类中其他native方法的实现映射到JVM虚拟机中内部的方法 等同于说执行Thread类中sleep方法就会执行JVM_Sleep这个JVM内部的方法 接下来我们看到registerNatives方法的实现看它是如何完成的映射。 JNIEXPORT void JNICALL Java_java_lang_Thread_registerNatives(JNIEnv *env, jclass cls) {// JNIEnv结构体是JNI给c语言提供访问JVM使用的内部有很多函数去访问JVM// 而这里就是调用JNIEnv结构体中RegisterNatives方法(*env)-RegisterNatives(env, cls, methods, ARRAY_LENGTH(methods)); } 又开发过JNI的读者可能这里就很容易理解JNIEnv这个结构体是JNI给c语言提供访问JVM使用的JNIEnv结构体内部有很多函数去访问JVM而这里就是调用JNIEnv结构体中RegisterNatives方法所以我们看到 src/share/vm/prims/jni.cpp 文件中RegisterNatives方法。 JNI_ENTRY(jint, jni_RegisterNatives(JNIEnv *env, jclass clazz,const JNINativeMethod *methods,jint nMethods))jint ret 0;// 获取到Klass对象在Hotspot中Klass对象可以理解是Java的类KlassHandle h_k(thread, java_lang_Class::as_Klass(JNIHandles::resolve_non_null(clazz)));// 遍历JNINativeMethod结构体数组for (int index 0; index nMethods; index) {// 获取到方法名和签名const char* meth_name methods[index].name;const char* meth_sig methods[index].signature;int meth_name_len (int)strlen(meth_name);// 把方法名和签名转换成Hotspot中符号信息实际上这一步无需关心TempNewSymbol name SymbolTable::probe(meth_name, meth_name_len);TempNewSymbol signature SymbolTable::probe(meth_sig, (int)strlen(meth_sig));// 我们需要把目标方法注册到类中的native方法// 这一步就是完成注册bool res register_native(h_k, name, signature,(address) methods[index].fnPtr, THREAD);}return ret; JNI_END 获取到Klass对象在Hotspot中Klass对象可以理解为Java的类因为类中定义了方法而这一步就是要把目标方法JVM内部方法注册到类中的native方法遍历JNINativeMethod结构体数组获取到方法名和签名信息因为需要通过它们找到native方法调用register_native方法完成注册工作 接下来只需要看到register_native方法的实现即可。 static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, address entry, TRAPS) {// 通过方法名和签名找到类中的方法Method* method k()-lookup_method(name, signature);………… // 省略一些判断if (entry ! NULL) {// 把目标方法JVM内部方法注册到类中的native中// 下次调用native方法时执行的就是JVM内部的方法method-set_native_function(entry,Method::native_bind_event_is_interesting);}………… // 省略一些判断return true; } 这里就特别的简单了通过方法名和签名得到方法然后把目标方法JVM内部方法设置到方法中下次执行native方法时就会执行JVM内部的方法 总结 整体流程不难但是笔者是直接 告诉答案  如果说需要完整的闭环JNI和native方法的注册和native方法的执行这个过程将会特别的复杂不过学习某个层面就应该把他的下层当作黑盒来理解即可
http://www.hkea.cn/news/14369680/

相关文章:

  • 网站策划建设做网站需要多少钱济宁
  • 餐饮加盟手机网站建设网站的配色方案
  • 站长之家官网入口利用ps做兼职的网站
  • 表格比较多得网站这么做响应式广告公司名称怎么取好
  • mvc4做网站五有网站可以接设计的单子做吗
  • 免备案空间网站备案wordpress翻译
  • 如何自己建网站服务器外贸营销型建站
  • iis7.5添加php网站优化网站排名推广
  • 公司的网站难不难做长沙seo培训
  • wordpress公园北京网站优化推广收集
  • 咸阳个人兼职网站建设旅游扁平化设计网站模板
  • 前端静态网站模板免费注册企业邮箱域名
  • 郴州网站建设设计食品包装设计要点
  • 上海seo网站优化_搜索引擎排名_优化型企业网站建设_锦鱼网络网站设计计划书的内容
  • 怎么给网站做关键词搜索廊坊网站建设方案
  • 五道口网站建设公司现在的网站一般做多宽最好
  • 网站开发维护合同范本网站注册可以免费吗
  • 嘉兴网站建设制作如何做网上推广产品
  • 如何制作网站板块旅游门户网站系统
  • 品牌网站建设新闻网站seo优化总结
  • wordpress本站运行wordpress 微信二维码
  • 自己想做个网站怎么做产品推广软文
  • 湖北金扬建设网站怎么在高德地图上添加自己的店铺
  • 做网站都有什么成本怎么做flash网站
  • 公司外贸网站建设云南专业做网站多少钱
  • 爱空间网站模板yellow在线观看高清完整版
  • 怎么看网站是用什么程序做的游戏推广代理app
  • 南山商城网站建设哪家便宜下载中国最新军事新闻
  • 专业的个人网站建设wordpress 编辑图像
  • 湖北省住房和建设厅网站辽宁省建设工程注册中心网站