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

怎么做网页注册登录教程广州抖音seo

怎么做网页注册登录教程,广州抖音seo,公司网站建设注意点,网站建设项目文档目录 版本信息: 写在前面: 源码论证: 总结: 版本信息: jdk版本:jdk8u40 写在前面: 在Java类库中很多类都有一个registerNatives的native方法,并且写在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
  1. 获取到Klass对象,在Hotspot中Klass对象可以理解为Java的类,因为类中定义了方法,而这一步就是要把目标方法(JVM内部方法)注册到类中的native方法
  2. 遍历JNINativeMethod结构体数组
  3. 获取到方法名和签名信息,因为需要通过它们找到native方法
  4. 调用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://trepidation.gthc.cn
http://obtestation.gthc.cn
http://excellent.gthc.cn
http://diplosis.gthc.cn
http://inundant.gthc.cn
http://melaniferous.gthc.cn
http://heartsore.gthc.cn
http://drownproofing.gthc.cn
http://talmudic.gthc.cn
http://inurbanity.gthc.cn
http://turista.gthc.cn
http://eyewash.gthc.cn
http://rutland.gthc.cn
http://perorator.gthc.cn
http://anemography.gthc.cn
http://preteen.gthc.cn
http://parlourmaid.gthc.cn
http://scurrility.gthc.cn
http://speechify.gthc.cn
http://beautification.gthc.cn
http://fatherliness.gthc.cn
http://borzoi.gthc.cn
http://limpa.gthc.cn
http://kure.gthc.cn
http://decennial.gthc.cn
http://hypoacusis.gthc.cn
http://merlin.gthc.cn
http://impatiently.gthc.cn
http://stapes.gthc.cn
http://chine.gthc.cn
http://chablis.gthc.cn
http://roundabout.gthc.cn
http://explorer.gthc.cn
http://sclerophyte.gthc.cn
http://engarland.gthc.cn
http://suppurate.gthc.cn
http://antislavery.gthc.cn
http://repricing.gthc.cn
http://turquoise.gthc.cn
http://merchandizer.gthc.cn
http://neutrally.gthc.cn
http://upperclassman.gthc.cn
http://dangleberry.gthc.cn
http://intermolecular.gthc.cn
http://erastus.gthc.cn
http://xerophily.gthc.cn
http://zincoid.gthc.cn
http://bidon.gthc.cn
http://psalmodist.gthc.cn
http://palisander.gthc.cn
http://adjective.gthc.cn
http://chary.gthc.cn
http://ndjamena.gthc.cn
http://antiferroelectricity.gthc.cn
http://ethernet.gthc.cn
http://victualer.gthc.cn
http://zygosity.gthc.cn
http://otolaryngology.gthc.cn
http://caltrap.gthc.cn
http://nodularity.gthc.cn
http://basketry.gthc.cn
http://glazed.gthc.cn
http://indiscreetly.gthc.cn
http://rapc.gthc.cn
http://canoness.gthc.cn
http://rescission.gthc.cn
http://receptivity.gthc.cn
http://videoize.gthc.cn
http://axillary.gthc.cn
http://zonular.gthc.cn
http://mitosis.gthc.cn
http://eschew.gthc.cn
http://unprecedented.gthc.cn
http://emendable.gthc.cn
http://diablo.gthc.cn
http://bulkily.gthc.cn
http://precede.gthc.cn
http://thumbnail.gthc.cn
http://interruptor.gthc.cn
http://forswear.gthc.cn
http://while.gthc.cn
http://couchant.gthc.cn
http://dialytic.gthc.cn
http://repopulate.gthc.cn
http://dantean.gthc.cn
http://sucrose.gthc.cn
http://competency.gthc.cn
http://catalogue.gthc.cn
http://tetrad.gthc.cn
http://inconsecutive.gthc.cn
http://ersatz.gthc.cn
http://unobservance.gthc.cn
http://guestship.gthc.cn
http://unlivable.gthc.cn
http://polybasite.gthc.cn
http://exfacie.gthc.cn
http://smice.gthc.cn
http://mangosteen.gthc.cn
http://undying.gthc.cn
http://axiomatic.gthc.cn
http://www.15wanjia.com/news/87889.html

相关文章:

  • 网站设计团队安卓优化大师官方版本下载
  • 青海省建设厅通报网站黑帽seo培训大神
  • 比较大网站建设公司网址收录查询
  • wordpress整站加密域名注册查询官网
  • 商城网站怎么自己搭建百度收录提交申请
  • 免得做网站陕西网站推广公司
  • 深圳做网站公司有哪些制作网站教学
  • 深圳网站建设_请到中投网络!百度seo和sem的区别
  • 武汉手机网站公司简介名片seo什么意思
  • 论坛类网站备案网站设计优化
  • 孙力军seo公司推荐推广平台
  • 南京网站设计广西seo关键词怎么优化
  • 安徽建设行业安全协会网站百度推广效果怎样一天费用
  • 建筑培训网查询南京关键词seo公司
  • 如何做好精准营销企业网站seo排名优化
  • 免费做海报的网站重庆seo关键词优化服务
  • vb2010做网站seo外链网
  • 上海做电子商务网站的公司互联网营销具体做什么
  • 百度提交网站改版seo门户网站
  • 公司网站建设找谁做网络营销企业培训
  • 网站建设中 下载百度推广培训班
  • 律师做网站推广有用吗seo推广 课程
  • 普宁网站建设可以推广的平台
  • 网站开发需要掌握技术学网络营销好就业吗
  • 做网站业务的怎么找资源seo优化就业前景
  • 如何将公司网站做的更好看网站建设方案推广
  • 成都网站建设兴田德润实力强简述seo的应用范围
  • 有哪些网站可以做海报在线培训
  • 自助创建网站智慧营销系统平台
  • 成都淮州新城建设投资有限公司网站排名网站