之前使用到JNI中,都是通过javah命令生成对应c/c++中的方法名,其规则为:java的包名+native方法名,我们把它称作静态注册。 JNI还可以使用动态注册,在JNI源码中,安卓系统(PathClassLoader)加载so文件时,首先会调用一个方法:JNI_OnLoad;这是系统预留给外部使用动态注册使用的,今天来使用动态注册的方式调用 void *) native_stringFromJNI } }; 每个元素中,第一个参数为Java中对应的方法,第二个参数为方法签名,第三个参数为c/c++中的函数指针,接下来写一个注册 总结: 静态注册: 每个class都需要使用javah生成一个头文件,并且生成的名字很长书写不便;初次调用时需要依据名字搜索对应的JNI层函数来建立关联关系,会影响运行效率 用javah 生成头文件方便简单 动态注册: 使用一种数据结构JNINativeMethod来记录java native函数和JNI函数的对应关系 移植方便(一个java文件中有多个native方法,java文件的包名更换后)
静态注册和动态注册 静态注册 默认情况下,就是静态注册,静态注册是最简单的方式,NDK开发过程中,基本上使用静态注册。前面的知识都是静态注册的方式。 优点: 开发简单 缺点: JNI函数名非常长 捆绑 上层 包名 + 类名 运行期 才会去 匹配JNI函数,性能上 低于 动态注册 动态注册 再看Android Framework源代码的Native 层,Android 系统的C++源码:基本上都是动态注册。 动态注册是怎么玩转的? 明白一个简单的道理,Java中我们new 类,默认会调用构造函数,重写了构造函数,就会调用我们自己的。 动态注册的方法参数,JNIEnv *env 和 jobject thiz,如果没有用到是可以不放到参数列表中,没有影像。
[logo] Spring之动态注册bean 什么场景下,需要主动向Spring容器注册bean呢? 如我之前做个的一个支持扫表的基础平台,使用者只需要添加基础配置 + Groovy任务,就可以丢到这个平台上面来运行了,而这个基础平台是一直都在运行的,所以在新来任务时,最直观需要注册的就是 DataSource 主动注册Bean支持 借助BeanDefinition来实现bean的定义,从最终的使用来看,代码比较少,几行而已 public <T> T registerBean(String name, Class
一.动态注册和静态注册 注册native方法有两种方式,动态注册和静态注册。 而动态注册是在运行时进行注册的,而且本地方法的名字可以按自己的喜好随意取,只要说明了java中声明的native方法和c/c++中的本地方法的对应关系即可。 下面用代码的形式来演示一下动态注册的使用步骤。 二.动态注册的步骤 1.在java中声明native方法,并在静态代码块中加载动态库: public class Test { static{ System.loadLibrary add(int a,int b); } 2.注册函数:在java中加载动态库的时候,虚拟机会调用JNI库中的JNI_Onload()函数,动态注册就是在这个函数中进行的。
JNI方法注册源码分析(JNI_OnLoad|动态注册|静态注册|方法替换) [icon13-png-ed.png] 背景 开发Android应用时,有时候Java层的编码不能满足实际需求,需要通过JNI 入门选手可以采用Native方法动态注册,混淆方名。 文章指在学会使用JNI方法动态注册,静态注册,方法替换,且在这个过程中稍微了解一下native层的动态库加载,方法加载等知识。 (JNIEnv *env, jobject /* this */) { return env->NewStringUTF("Hello from C++ dynamic\n"); } 经过动态注册之后 优点 简单明了 so方法动态注册 这种方式,写的代码稍微多点,但好处很明显,函数映射关系配置灵活,执行效率要比第一种方式高。 JNINativeMethod是动态注册方法需要的结构体: typedef struct { const char* name;//在java中声明的native函数名 const char*
使用Spring期间可能会遇上需要动态注册bean的时候,此时可以通过如下实现: 基本步骤 //将applicationContext转换为ConfigurableApplicationContext 此属性引用已经定义的bean:userAcctDAO beanDefinitionBuilder.addPropertyReference("userAcctDAO", "UserAcctDAO"); // 注册
用CheckEdit演示 其他控件类推 CheckEdit AllSele = new CheckEdit(); AllSele.Location = new System.Drawing.Point(10, 16); AllSele.Text = "全选"; this.groupBox5.Controls.Add(AllSele); AllSele
一、静态广播注册 MainActivity.java public class MainActivity extends AppCompatActivity { @BindView(R.id.btn_send :StaticBR.java /** * 作者:张风捷特烈 * 时间:2018/4/14:16:22 * 邮箱:1981462002@qq.com * 说明:静态注册广播接受者 */ public aii_broadcastreceiver", "com.toly1994.aii_broadcastreceiver.StaticBR")); ---- 二、动态注册 在未注册之前,点击发送无效果,在注册后点击发送有效果,在注销之后点击无效果。 动态注册广播.gif 注册方法: IntentFilter filter = new IntentFilter(); filter.addAction("com.toly1994.aii_broadcastreceiver.register
本文档描述freeswitch的动态配置SIP账户,以及动态修改拨号方案的问题。 bindings="dialplan" 表示该接口返回拨号方案信息 2、 动态配置SIP信息 修改好配置文件后,freeswitch获取验证sip注册信息时,将调用接口:directory来进行获取注册信息 xml 4、用户不为空时生成注册的xml信息 5、使用sip信息,参数:sip_to_host(ip地址)以及数据库中获取的密码信息:pwd,进行md5加密,加密失败时返回注册失败的xml信息 6、生成参数 // 加一个空行(结束行) } 3、 使用beel工具类处理模版信息时,项目需要导入jar包:antlr4-runtime-4.7.1.jar,beetl-core-2.2.3.jar,按需配置 3、动态配置拨号方案 修改好配置文件后,freeswitch获取验证sip注册信息时,将调用接口:dial来进行获取注册信息 创建拨号方案表 CREATE TABLE `dial_tab` ( `id` int(11
Native 方法的静态注册 NDK 开发中,通过 javah -jni 命令生成的包含 JNI 的头文件,接口的命名方式一般是: Java_<PackageName>_<ClassName>_<MethodName 程序执行时系统会根据这种命名规则来调用对应的 Native 方法,这种注册方式称之为静态注册。 Native 方法的动态注册 由于静态注册存在命名局限性,生产环境中一般不采用静态注册的方式。动态注册的优点是可以自由命名 Native 方法,缺点是如果 Native 方法过多,操作比较麻烦。 动态注册的时机是在加载函数库(.a 或 .so)的时候进行注册,即在 JNI_OnLoad 方法里进行注册。 = JNI_TRUE) return JNI_ERR; return JNI_VERSION_1_6; } 以上 3 步便可实现动态注册。 -- END --
org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor 接口的继承关系 BeanDefinitionRegistryPostProcessor在Spring中的应用 示例 注册 举个例子: 动态注册自己的beanDefinition,加载classpath之外的bean ---- 接口的继承关系 接口方法 void postProcessBeanDefinitionRegistry BeanDefinitionRegistry registry) throws BeansException; 入参 为 接口 BeanDefinitionRegistry 主要看提供的接口方法,可以发现提供的方法来主要有注册 、反注册、判断 等操作 ---- BeanDefinitionRegistryPostProcessor在Spring中的应用 org.springframework.context.support.AbstractApplicationContext postProcessBeanFactory方法 invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); ---- 示例 注册
前言 本文的素材来自读者的一个问题,他看过我之前写的一篇博文聊聊如何把第三方服务注册到我们项目的spring容器中。 今天就来聊一下这个话题,为什么使用registerSingleton()注册的bean,无法使AOP生效 问题根源 registerSingleton()这个方法直接将bean存放到单例池里面了。 new出来的,就是一个普通的对象,因此注入到IOC容器后,也只是一个普通的bean,并没有任何增强 问题修复 方案一:不使用registerSingleton(),而是使用BeanDefinition注册方式
【Android】JNI静态与动态注册介绍 JNI的两种注册机制:静态注册和动态注册. 方式: 静态注册 动态注册:需要提供Java中Native方法的方法签名和Native层中对应的实现函数。 静态注册 要求C/C++层的函数名符合某种特定的要求:包含Java中Native方法的目录信息和方法名。 动态注册 动态注册相对于静态注册,优点是不再根据特定路径查找函数的实现,带来两个好处: 没有了冗杂的函数名,适用于大型项目开发。 一种可行的方法是基于JNI重载JNI_OnLoad(),在其中对函数进行动态注册。
手动注册Bean方式 1. 核心实现类 以前也写过关于动态注册Bean的博文,如 180804-Spring之动态注册bean 我们的实现方式和上面也没什么区别,依然是借助BeanDefinition来创建Bean定义并注册到BeanFactory 测试用例 动态创建Bean,并不是塞入容器之中就完结了,塞进去之后,是为了后续的使用,自然而然的就会有下面几种情形 a. Bean注册实现 前面定义了两个需要手动注册的bean,所以就需要选择一个合适的地方来处理主动注册的逻辑,我们把这段逻辑放在AutoConfig中,用于测试演示 @Configuration public Bean实例,使用supply接口, 可以创建一个实例,并主动注入一些依赖的Bean;当这个实例对象是通过动态代理这种框架生成时,就比较有用了 BeanDefinitionBuilder
根据资料,该接口的主要作用就是用来动态的注入bean到spring ioc中。但是问题是什么是动态,或者怎么样的操作才算是动态。难道以前都不算动态吗。 作者对这里的动态的理解是可以用户自定义的决定注入哪些类。这里的自定义就是规则。根据作者的实践,认为就是注入作者自定义的注解的bean到ioc容器中。那么如何实现一个自定义的动态注入器。
这就是静态注册 动态注册:上面类似一张静态表,但是如果每个JNI的方法与Java的代码有个映射表,只要将这张表告诉JVM,那就可以找到对应的C++方法了 静态注册 对于静态注册,JNI的方法命名规则为: 动态注册 动态注册的关键字是两个: JNI_OnLoad()方法,这个是载入Jni库后调用的第一个方法,在这里可以将方法对应表注册给JNI环境 JNINativeMethod结构,这个结构是将jni层的方法映射到 static {}; descriptor: ()V} 其中descriptor就是对应的签名,比如方法"sayHello"对应的方法签名就是"()Ljava/lang/String;" 静态注册与动态注册的区别 静态注册,每次使用native方法时,都要去寻找;而动态注册,由于有张表的存在,因此查找效率高。 编译 上面不管是静态注册方法,还是动态注册方法,都需要将cpp文件编译成平台所需要的库。 总结 上面主要是我自己从使用NDK开发中体会到的需要掌握的东西,最主要是静态注册与动态注册的实现。后面会介绍Java和JNI层如何互相作用,敬请期待。
动态注册方法 RegisterNatives ( 核心重点 ) VII . 动态注册流程完整代码 I . 动态注册流程 ( 总结 ) ---- 动态注册流程 : ① 声明 Java 层 Native 方法 : 在 Java 类中声明 native 方法 ; /** * 动态注册 JNI 方法 动态注册流程完整代码 ---- 1 . 动态注册 动态注册 : 动态注册与静态注册 : 静态注册 : 使用 Java_包名_类名_方法名(JNIEnv* env, jobject obj, . 方式进行注册是静态注册 动态注册 : 将 C/C++ 中的本地方法 与 Java 中的方法对应起来 , 就需要使用动态注册 动态注册 与 静态注册 : 没有太大区别
用一个完整的例子来查看android是怎么实现动态注册的(MediaPlayer) frameworks\base\media\java\android\media\MediaPlayer.java . 而JNI_OnLoad的调用处,就是System.loadLibrary 的时候会走到 // 这里,然后进行动态注册 jint JNI_OnLoad(JavaVM* vm, void* /* reserved JNI 动态注册 根据以上的分析进行实现: java代码: public class FileUtils { public static native void diff(String path JNIEnv *env, jclass clazz, jstring path, jstring pattern_Path, jint file_num) { LOGI("JNI begin 动态注册的方法 生一个头文件 操作简单 2.名字很长 书写不方便 3.初次调用的使用,需要依据名字搜索对应的FindSymbol(具体看Runctime.c) 来找到对应的方法,如果方法数较多的时候,效率不高 动态注册
--============================== -- 配置非默认端口的动态服务注册 --============================== 从Oracle客户端连接到服务器 ,除了使用静态注册方式之外,9i后续的版本支持动态注册服务,同时可以将服务注册到非默认的端口。 将服务注册到非默认端口可以提高数据库系统的安全性。 The command completed successfully 四、总结 1.对于使用非默认端口的动态注册,需要手工指定端口号。 alter system set local_listener = 'listener_name'; 4.成功修改local_listener参数后,如果还没有看到注册的服务名,使用下面的命令来实现注册
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册、注销BroadcastReceiver的栗子。 1、首先创建一个MyReceiver并继承BroadcastReceiver,既然要动态注册该receiver的话,就无需在AndroidManifest.xml中配置它了: 1 public class 2、布局文件如下,很简单,只有三个按钮:发送消息按钮、注册receiver按钮和注销receiver按钮。 default: 36 break; 37 } 38 } 39 } 代码分析:本段代码在23行,通过registerReceiver()方法动态的注册了 测试就会发现在点击发送消息按钮之前,如果没有注册receiver的话是不能成功发送消息的,只有注册了receiver,点击发送消息log中才有输出: ?