前言:以下内容是个人在写JNI Demo前后进行查找理解总结得出的一些结论,如有错误的地方希望路过的朋友能够指正。

一、JNI是Java native interface的简称,目前就我所知这类方法的实现方式是由C/C++实现并保存在动态链接库里;一般是这些方法需要能更有效率的执行所以将它们定义为JNI方法(权限似乎也是一方面?),JNI方法除了加上native关键字在返回类型前面以及实现方式由C/C++实现外在使用方式上和其它方法没有区别。

二、个人用的开发环境是Windows7x64、IDEA2017.2.1x64、VS2015x64、JDK1.8x64,此次Demo只是做了一些JNI的简单使用,真正使用场景将会涉及到如数据转换等问题。

三、个人对JNI原理的理解:Java代码里能够调用C/C++类库是因为有JVM为这两者做适配,因为JVM本身就是C/C++写的程序,自然它能够调用C/C++写的动态链接库,故当Java代码里请求调用一个JNI方法时,会将所需数据提交给JVM,然后JVM再将参数包装后去调用dll中对应的方法,然后dll中对应方法执行完毕后再由JVM将返回数据进行一定的转换后返回给请求的Java代码处。

四、现在就让咱们一起用用这神秘的JNI方法吧,先是定义一个类JNIDemo类:

package silentdoer.demo;

public class JNIDemo {
static{
System.loadLibrary("JNIMethods01"); // 这个是JNIMethods01.dll文件的前缀名
} public static native int compare(int a, int b); public static native void hello(); public native int sub(int a, int b);
}
// 注:后面用javah命令时如果出现编码GBK的不可映射字符错误将中文删除即可

接着运行cmd,将路径切换到此项目的src目录,然后输入命令javah silentdoer.demo.JNIDemo按下回车键

会在src目录下生成silentdoer_demo_JNIDemo.h头文件(也可以进入classes目录用上面的javah命令,不过这种方式如果此类里引用了其它地方的类会出现异常)

五、接着打开VS2015,然后新建一个空解决方案起名为Demo.JNI,如图:

然后在生成的解决方案里右键添加-新建项目,然后添加一个C++的Win32项目起名为JNIMethods01:

点击确定然后点击下一步直到:

选择应用程序类型Radio的DLL项点击完成(也可以取消勾选预编译头和安全开发生命周期检查);

六、由于我的开发环境都是64位的,故要将C++生成dll的类型也改为64位,顺便将Debug改为Release,如图:

将生成的头文件silentdoer_demo_JNIDemo.h复制到此项目的根目录下(不是解决方案),然后右键项目-添加-现有项

将刚才的头文件添加到项目的头文件分类里,如图:

此时添加的头文件里会报错,需要添加jni.h和jni_md.h两个头文件到项目的头文件分类里,这两个文件在JDK的include目录中,如图箭头:

jni_md.h在win32子目录里;复制到项目根目录后以同样的方式添加进项目里;

这里需要改下silentdoer_demo_JNIDemo.h中#include <jni.h>为#include "jni.h",因为"jni.h"才是从项目路径里搜索的方式。

七、将silentdoer_demo_JNIDemo.h中的三个方法复制到JNIMethods01.cpp中并添加头文件引用,然后实现这三个方法:

八、点击VS2015上边的生成-重新生成解决方案,然后找到此解决方案目录下的x64/Release目录,将JNIMethods01.dll复制到

E:\MyJNILib目录里(也可以在其它目录里),然后添加Path环境变量,如图:

九、此时可以在刚才的Java项目里添加main方法:

import silentdoer.demo.JNIDemo;

public class Entrance {
public static void main(String[] args){
JNIDemo.hello();
System.out.println(JNIDemo.compare(3, 4) >= 0 ? "a >= b" : "a < b");
System.out.println(new JNIDemo().sub(10, 6));
}
}

重启一遍IDEA(因为IDEA只有启动时才加载Path环境变量),运行后输出:

hello everyone, I'm silentdoer.
a < b
4

至此初篇完结,如有错误望各位指正,转载请注明原文地址。

JNI的使用总结初篇的更多相关文章

  1. ReactNative 4Android源码分析二: 《JNI智能指针之实现篇》

    文/Tamic http://blog.csdn.net/sk719887916/article/details/53462268 回顾 上一篇介绍了<ReactNative4Android源码 ...

  2. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

  3. React Native 4 for Android源码分析 一《JNI智能指针之介绍篇》

    文/ Tamic: http://blog.csdn.net/sk719887916/article/details/53455441 原文:http://blog.csdn.net/eewolf/a ...

  4. (转)JNI入门教程之HelloWorld篇 .

    转: http://blog.csdn.net/mingjava/article/details/180946 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...

  5. 如何使用java调用DLL运行C++(初篇)

    JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图:

  6. android 自定义控件(初篇)

    android 自定义控件 在写UI当中很多时候会用到自定义的控件,其实自定义控件就像是定义一个类进行调用就OK了.有些相关的感念可以查看API 下面就用个简单的例子来说明自定义控件: public ...

  7. Elastic Stack初篇-Logstash

     一.Logstash简介      Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 二.Log ...

  8. 深入理解java虚拟机系列初篇(一):为什么要学习JVM?

    前言 本来想着关于写JVM这个专栏,直接写知识点干货的,但是想着还是有必要开篇讲一下为什么要学习JVM,这样的话让一些学习者心里有点底的感觉比较好... 原因一:面试 不得不说,随着互联网门槛越来越高 ...

  9. 初篇:我与Linux

        据悉,红帽认证将于本年的8月份更换Rhel7为Rhel8.所以我想趁这次机会搏一搏.     我个人是初中就神仰Linux已久,只不过那个时候的我只知道Linux系统,不知道有什么区分.奈何那 ...

随机推荐

  1. 两种数据传输的方式——get和post。

    Form提供了两种数据传输的方式——get和post.虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响.虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一 ...

  2. CTF线下攻防赛

    SSH登陆 两三个人进行分工,一个粗略的看下web,有登陆口的话,就需要修改密码,将情况反馈给队友,让登陆ssh的小伙伴进行密码的修改,改成炒鸡复杂.然后将Web目录下载下来,上WAF.文件监控.端口 ...

  3. CentOS 7 yum 安装ownCloud 搭建云盘服务器

    基于CentOS7.0 64位系统+ownCloud 10.0 稳定版本构建 ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可 ...

  4. c# Debug的一些技巧

    c# Debug的一些技巧 专业工作也快两年,从最开始的F9,F10的断点调试,慢慢积累一些调试的技巧,令开发工作更加的效率 1.F9   最基础的断点, 点击F10 不跳入方法内部,点击F11逐行逐 ...

  5. Mysql update in报错 [Err] 1093 - You can't specify target table 'company_info' for update in FROM clause

    Mysql update in报错 解决方案: [Err] 1093 - You can't specify target table 'company_info' for update in FRO ...

  6. C#开发Windows窗体应用程序的步骤

    使用C#开发应用程序时,一般包括创建项目.界面设计.设置属性.编写程序代码.保存项目.程序运行等6个步骤. 1.创建项目 在Visual Studio2017开发环境中选择“文件”→“新建”→“项目” ...

  7. VMware中克隆虚拟机出现eth0改变为eth1情况

    解决如下: 查看复制虚拟机网卡信息如下: root@jcfx-2 ~]# ifconfig eth1 Link encap:Ethernet HWaddr 00:0C:29:CC:32:63 inet ...

  8. redis秒杀

    用Redis轻松实现秒杀系统 秒杀系统的架构设计 秒杀系统,是典型的短时大量突发访问类问题.对这类问题,有三种优化性能的思路: 写入内存而不是写入硬盘 异步处理而不是同步处理 分布式处理 用上这三招, ...

  9. Bzoj 4950

    Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛上豪赌输掉了一大笔钱,所以他需要再干一票.为此他需要你的帮助 ...

  10. 3.python元组与列表

    Python的元组与列表类似,同样可通过索引访问,支持异构,任意嵌套.不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号. 创建元组 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开 ...