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的引用如下:

  1. 新建clz_Register.c文件,引入clz_Register.h,实现.h中对应的函数

  1. 在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中加载库,并且调用库中函数

动态注册

  1. 首先,在eclipse新建一个Java Application,名称可以随意,比如叫JavaJni,然后在src目录下新建一个package名为register,在register包下新建java类DynamicRegister.java,类中写native方法如下:

  1. 在Clion中,新建一个C++ Library,Library type选择shared,并将jdk/include下的jni.h文件和jni_md.h文件拷贝过来
  2. 新建DynamicRegister.c文件,引入jni.h和实现两个方法,如下

  1. 添加动态注册

  1. 在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中加载库,并且调用库中函数

JNI静态注册与动态注册详解的更多相关文章

  1. Linux下Gcc生成和使用静态库和动态库详解(转)

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  2. Linux下Gcc生成和使用静态库和动态库详解

    参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库 ...

  3. Linux-Gcc生成和使用静态库和动态库详解

    一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同( ...

  4. 【转】Linux下gcc生成和使用静态库和动态库详解

    一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不 ...

  5. Linux静态库与动态库详解

    引言 为了代码的复用性和模块化,我们常常使用一些库文件,在Windows操作系统下位.lib .dll作为静态库和动态库的后缀名. 在Linux下,静态链接库名字一般为libabcdef.a,其中ab ...

  6. Apache静态编译与动态编译详解

    Apache拥有4层结构,从核心到外层的module.而外层的module可以用通过静态和动态两种方式与Apache共同工作.这也就引入下文的“动态”和“静态”两种编译安装方式: 静态编译: 编译的时 ...

  7. C++静态库与动态库详解

    1 库的概念? 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库. 2 动态库与静态库的概念? 先回顾一下编译过程: 2.1 静态库 静态库在链接阶段,会将汇编生成的目 ...

  8. linux下的静态库与动态库详解

    静态库 先说说我们为什么需要库? 当有些代码我们大量会在程序中使用比如(scanf,printf等)这些函数我们需要在程序中频繁使用,于是我们就把这些代码编译为库文件,在需要使用时我们直接链接即可. ...

  9. Linux共享库、静态库、动态库详解

    1. 介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用.程序函数库 ...

  10. (zz)Linux下Gcc生成和使用静态库和动态库详解

    http://blog.chinaunix.net/uid-23592843-id-223539.html

随机推荐

  1. Mybatis系列(四)注解

    Mybatis系列(四)注解 1.pom.xlm: <?xml version="1.0" encoding="UTF-8"?> <proje ...

  2. JDK8时间工具类

    JDK8添加了java.time包,提供了很多方便.用得比较多的几个类:Instant 在时间线上模拟单个瞬时点Duration 以秒和纳秒为单位模拟一个数量或时间量.可以使用其他基于持续时间的单位访 ...

  3. python+selenium自动化测试——浏览器驱动

    selenium控制浏览器需要下载对应版本的驱动,并把下载好的驱动解压然后拷贝到python的安装目录. 1.chrome 驱动对应版本及下载地址;https://npm.taobao.org/mir ...

  4. Fliptile(枚举+DFS)

    Problem Description Farmer John knows that an intellectually satisfied cow is a happy cow who will g ...

  5. linux文件系统分区、格式化、挂载、卷标挂载、永久挂载

    思想不放松你的行为就不会放松,你的行为放松了,说明你的思想放松了.

  6. select2的多选下拉框上传

    1.加入multiple: true,属性实现多选下拉框样式 2.下拉框选择后的值是数组类型不要经过数据处理才能进行表单提交 提交的时候原下拉框所在的标签不提交,而是将多选后的值存入页面中的一个隐藏标 ...

  7. 豆瓣电影TOP250和书籍TOP250爬虫

    豆瓣电影 TOP250 和书籍 TOP250 爬虫 最近开始玩 Python , 学习爬虫相关知识的时候,心血来潮,爬取了豆瓣电影TOP250 和书籍TOP250, 这里记录一下自己玩的过程. 电影 ...

  8. [VB.NET Tips]字符串连接

    在很多应用场景下我们都需要对字符串进行拼接操作. 在每一次连接字符串时,都要在堆上分配新的内存空间,每一个分配都有一定的消耗. 较长的字符串在堆中分配,对其进行连接操作需要花费很长的时间,先连接小的字 ...

  9. Nginx反向代理之动静分离

    我们已经知道了什么是正向代理与反向代理,这次我们就讲一下Nginx的动静分离的案例,其实质运用的就是反向代理,专门用一台服务器代理服务器上的图片资源. 想使用代理必然要配置代理,配置反向代理,必须要用 ...

  10. 编程范式 --- 面向协议编程(Protocol Oriented Programming,简称POP)

    面向协议编程(Protocol Oriented Programming,简称POP) 是Swift的一种编程范式,Apple于2015年WWDC踢出 在Swift的标准库中,能见到大量POP的影子 ...