java 动态加载jni_JNI静态注册与动态注册详解
JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的。JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态注册是通过动态添加映射关系来进行关联,方法名可以随便起,比较灵活,我们推荐使用动态注册。在进行注册前,需要先下载两个工具Clion和eclipse(能写java application就可以),然后我们就可以开始注册了。
静态注册
1.首先,在eclipse新建一个Java Application,名称可以随意,比如叫JavaJni,然后在src目录下新建一个package名为clz,再clz包下新建java类Register.java,类中写一个native方法如下:
2.进入命令行,来到Register.java所在目录下,使用命令 javac Register.java生成Register.class文件
3.命令行,回到src目录下,通过命令 javah clz.Register 生成clz_Register.h
4.在Clion中,新建一个C++ Library,Library type选择shared,并将jdk/include下的jni.h文件和jni_md.h文件拷贝过来
5.将第三步中生成的clz_Register.h文件拷贝到Clion中刚刚新建的项目中
6.修改jni.h的引用如下:
新建clz_Register.c文件,引入clz_Register.h,实现.h中对应的函数
在Clion项目中的CMakeLists.txt中添加编译配置
第一个参数firstlib,表示编译后生成的动态库名称
第二个参数可以选择STATIC或者SHARED,分别表示是静态库还是动态库,一般我们使用动态库
第三个及后面的参数,表示需要编译入库的文件
9.在Clion中选择Build-BuildProject,可以在cmake-build-debug下生成libfirstlib.dylib(mac为dylib,windows为dll)
10.将第8步生成的libfirstlib.dylib拷贝到eclipse项目的libs目录下(没有可新建)
11.在Register.java中加载库,并且调用库中函数
动态注册
首先,在eclipse新建一个Java Application,名称可以随意,比如叫JavaJni,然后在src目录下新建一个package名为register,在register包下新建java类DynamicRegister.java,类中写native方法如下:
在Clion中,新建一个C++ Library,Library type选择shared,并将jdk/include下的jni.h文件和jni_md.h文件拷贝过来
新建DynamicRegister.c文件,引入jni.h和实现两个方法,如下
添加动态注册
在Clion项目中的CMakeLists.txt中添加编译配置
第一个参数firstlib,表示编译后生成的动态库名称
第二个参数可以选择STATIC或者SHARED,分别表示是静态库还是动态库,一般我们使用动态库
第三个及后面的参数,表示需要编译入库的文件
6.在Clion中选择Build-BuildProject,可以在cmake-build-debug下生成libfirstdylib.dylib(mac为dylib,windows为dll)
7.将第8步生成的libfirstdylib.dylib拷贝到eclipse项目的libs目录下(没有可新建)
8.在DynamicRegister.java中加载库,并且调用库中函数
java 动态加载jni_JNI静态注册与动态注册详解相关推荐
- 动态加载和静态加载及其编译步骤
在类unix操作系统中,驱动加载方式一般分为:动态加载和静态加载,下面分别对其详细论述. 一.动态加载 动态加载是将驱动模块加载到内核中,而不能放入/lib/modules/下. 在2.4内核 ...
- 动态加载vs静态加载
动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...
- Linux动态库的动态加载与静态加载以及加载依赖了其他动态库的动态库
Linux动态库加载 在Linux下,动态库格式一般为libxxx.so或者libxxx.so.3这种格式. 通常我们在网上下载下来源码包,编译之后会是libxxx.so软连接libxxx.so.1链 ...
- python requests 动态加载_Python获取网页中动态加载的数据
Python获取网页中动态加载的数据 0.XHR 是什么? XHR是 XMLHttpRequest 对象.既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装. 1.查看异步加 ...
- python 动态加载与静态加载_python中的元类、静态方法、类方法,动态添加方法...
首先介绍几个概念: 1.#所谓的静态方法就是这个方法任何类都可以调用,程序一加载就存在的方法 2.所谓的类方法就是这个类一加载就存在的方法,不用实例化这个类就已经存在的方法 3.所谓的元类就是创建类的 ...
- python 动态加载与静态加载_python+django加载静态网页模板解析
今天我们来看看Django是如何加载静态html的? 我们首先来看一看什么是静态HTML,什么是动态的HTML?二者有什么区别? 静态HTML指的是使用单纯的HTML或者结合CSS制作的包括图片.文字 ...
- 【android】静态链接器/加载器(ld) 动态加载器(/system/bin/linker)+动态加载接口(dlopen)
android linker 浅析 Android动态连接器linker与静态连接器ld
- android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...
本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...
- python爬虫动态加载页面_如何爬动态加载的页面?ajax爬虫你有必要掌握
通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这 ...
最新文章
- php http请求xml数据,php获取通过http协议post提交过来xml数据及解析xml
- 《LeetCode力扣练习》第16题 C语言版 (做出来就行,别问我效率。。。。)
- 设计模式--6大原则--开闭原则
- ubuntu14.04环境下spyder的安装
- 信息抽取(四)【NLP论文复现】Multi-head Selection和Deep Biaffine Attention在关系抽取中的实现和效果
- Python3之Django Web框架中间件???
- 获得国内中国电信,网通,铁通的最新ip段的方法
- 今天参加广州.NET俱乐部活动,运气超好
- centos mysql-dev_CentOS7 安装 mysql
- Html5 video 标签中视频有声音没画面问题解决过程
- PHP_框架储备资料
- SARscape操作:Sentinel-1 SLC影像镶嵌、裁切
- 3DMax环境贴图无法正常显示的一种解决方法
- 大型粒子对撞机已被上面叫停了!何祚庥:希望杨振宁李政道有生之年重归于好...
- LeetCode 56~60
- 刀塔霸业怎么在电脑上玩 刀塔霸业电脑版玩法教程
- mysql容灾方案_mysql 容灾 灾备 备份
- 慕课网付费视频 linux,分享给 Linux 用户的 10 有用工具
- CATIA许可证安装,破解文件运行不了直接跳到finish问题
- 计算机域名(domain name)
热门文章
- 吴恩达机器学习 8.应用机器学习的建议
- Redis基础(九)——发布与订阅
- 梯度为什么是函数增加最快的方向
- [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
- 第一:如何解决robot framework log.html中的中文乱码问题
- 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁
- .net byte转java byte_Java 最小值之谜
- android左右滑动开关,Android点击左右按钮实现左右滑动页面切换
- python中文文本处理_python简单文本处理的方法
- JS面向对象系列之一[prototype,原型]