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静态注册与动态注册详解相关推荐

  1. 动态加载和静态加载及其编译步骤

    在类unix操作系统中,驱动加载方式一般分为:动态加载和静态加载,下面分别对其详细论述. 一.动态加载 动态加载是将驱动模块加载到内核中,而不能放入/lib/modules/下.     在2.4内核 ...

  2. 动态加载vs静态加载

    动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...

  3. Linux动态库的动态加载与静态加载以及加载依赖了其他动态库的动态库

    Linux动态库加载 在Linux下,动态库格式一般为libxxx.so或者libxxx.so.3这种格式. 通常我们在网上下载下来源码包,编译之后会是libxxx.so软连接libxxx.so.1链 ...

  4. python requests 动态加载_Python获取网页中动态加载的数据

    Python获取网页中动态加载的数据 0.XHR 是什么? XHR是 XMLHttpRequest 对象.既Ajax功能实现所依赖的对象,在JQuery中的Ajax是对 XHR的封装. 1.查看异步加 ...

  5. python 动态加载与静态加载_python中的元类、静态方法、类方法,动态添加方法...

    首先介绍几个概念: 1.#所谓的静态方法就是这个方法任何类都可以调用,程序一加载就存在的方法 2.所谓的类方法就是这个类一加载就存在的方法,不用实例化这个类就已经存在的方法 3.所谓的元类就是创建类的 ...

  6. python 动态加载与静态加载_python+django加载静态网页模板解析

    今天我们来看看Django是如何加载静态html的? 我们首先来看一看什么是静态HTML,什么是动态的HTML?二者有什么区别? 静态HTML指的是使用单纯的HTML或者结合CSS制作的包括图片.文字 ...

  7. 【android】静态链接器/加载器(ld) 动态加载器(/system/bin/linker)+动态加载接口(dlopen)

    android linker 浅析 Android动态连接器linker与静态连接器ld

  8. android viewpager动态加载页面,Android viewpager中动态添加view并实现伪无限循环的方法...

    本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法.分享给大家供大家参考,具体如下: viewpager的使用,大家都熟悉,它可以实现页面之间左右滑动的切换,这里 ...

  9. python爬虫动态加载页面_如何爬动态加载的页面?ajax爬虫你有必要掌握

    通过前面几期Python爬虫的文章,不少童鞋已经可以随心所欲的爬取自己想要的数据,就算是一些页面很难分析,也可以用之前介绍的终极技能之「Selenium」+「Webdriver」解决相关问题,但无奈这 ...

最新文章

  1. php http请求xml数据,php获取通过http协议post提交过来xml数据及解析xml
  2. 《LeetCode力扣练习》第16题 C语言版 (做出来就行,别问我效率。。。。)
  3. 设计模式--6大原则--开闭原则
  4. ubuntu14.04环境下spyder的安装
  5. 信息抽取(四)【NLP论文复现】Multi-head Selection和Deep Biaffine Attention在关系抽取中的实现和效果
  6. Python3之Django Web框架中间件???
  7. 获得国内中国电信,网通,铁通的最新ip段的方法
  8. 今天参加广州.NET俱乐部活动,运气超好
  9. centos mysql-dev_CentOS7 安装 mysql
  10. Html5 video 标签中视频有声音没画面问题解决过程
  11. PHP_框架储备资料
  12. SARscape操作:Sentinel-1 SLC影像镶嵌、裁切
  13. 3DMax环境贴图无法正常显示的一种解决方法
  14. 大型粒子对撞机已被上面叫停了!何祚庥:希望杨振宁李政道有生之年重归于好...
  15. LeetCode 56~60
  16. 刀塔霸业怎么在电脑上玩 刀塔霸业电脑版玩法教程
  17. mysql容灾方案_mysql 容灾 灾备 备份
  18. 慕课网付费视频 linux,分享给 Linux 用户的 10 有用工具
  19. CATIA许可证安装,破解文件运行不了直接跳到finish问题
  20. 计算机域名(domain name)

热门文章

  1. 吴恩达机器学习 8.应用机器学习的建议
  2. Redis基础(九)——发布与订阅
  3. 梯度为什么是函数增加最快的方向
  4. [PHP] 算法-邻接矩阵图的广度和深度优先遍历的PHP实现
  5. 第一:如何解决robot framework log.html中的中文乱码问题
  6. 如何防止线程死锁java_Java 并发编程:如何防止在线程阻塞与唤醒时死锁
  7. .net byte转java byte_Java 最小值之谜
  8. android左右滑动开关,Android点击左右按钮实现左右滑动页面切换
  9. python中文文本处理_python简单文本处理的方法
  10. JS面向对象系列之一[prototype,原型]