JNI技术详解

Wesley13
• 阅读 705

前段时间探究了点关于JNI技术方面的东西,在网上找,发现关于这方面的东西很少
基本上也是找不到,所以就决定写下来,做个笔记:
JNI:
 JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,
但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
 我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要JNI的
但在下面这几种情况下你可能会用到JNI技术:
1.你的Java代码,需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。 
2.在本地还有一个别的系统,不过他不是Java语言实现的,这个时候你的老板要求你把两套系统整合到一起。 
3.你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。

对于上述的三种情况,如果没有JNI的话,那就会变得异常棘手了。就算找到解决方案了,也是费时费力。其实说到底还是会增加开发和维护的成本。

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。
对于JNI来说:其具体步骤如下:
1.先对Java文件对应编译  javac filename.java
filename.java文件内容eg.

  1. class HelloWorld  
  2. {  
  3.     private native void print();  
  4.     static   
  5.     {  
  6.         System.loadLibrary("HelloWorld");  
  7.     }  
  8.     public static void main(String[] args)  
  9.     {  
  10.         new HelloWorld().print();  
  11.     }  
  12. }

 

2.生成对应的.h文件 javah -jni filename此命令执行完后在目录中会生成HelloWorld.h文件,该文件中国包含了一个函数java_HelloWorld_print的声明。

点赞
收藏
评论区
推荐文章
刘望舒 刘望舒
3年前
Android深入理解JNI(一)JNI原理与静态、动态注册
Android框架层Android深入理解JNIAndroid框架层本文首发于微信公众号「刘望舒」前言JNI不仅仅在NDK开发中应用,它更是Android系统中Java与Native交互的桥梁,不理解JNI的话,你就只能停留在JavaFramework层。这一个系列我们来一起深入学习JNI。<!more1.JNI概述Android系统按语言来划分的
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
JNI学习笔记
  Java类型           本地类型          JNI中定义的别名   intlongjintlong\_int64jlongbytesignedcharjbytebooleanunsignedcharjbooleancharunsign
Stella981 Stella981
3年前
JNI线程、Linux常用命令、权限、防火墙配置
JNI\_OnLoad:调用System.loadLibrary()函数时,内部就会去查找so中的JNI\_OnLoad函数,如果存在此函数则调用。JNI\_OnLoad会:告诉VM此native组件使用的JNI版本。​对应了Java版本,android中只支持JNI\_VERSION\
Wesley13 Wesley13
3年前
JNI实战全面解析
简介项目决定移植一款C开源项目到Android平台,开始对JNI深入研究。JNI是什么?JNI(JavaNativeInterface)意为JAVA本地调用,它允许Java代码和其他语言写的代码进行交互,简单的说,一种在Java虚拟机控制下执行代码的标准机制。NDK是什么?AndroidNDK(NativeDe
Wesley13 Wesley13
3年前
JNI 技巧
JNI是指Java本地层接口(JavaNativeInterface)。它为用Java语言编写的受控代码定义了一种与本地层代码(用C/C编写)交互的方式。它是厂商无关的,其支持从动态共享库加载代码,尽管有时笨重,但它仍是有效的。如果你对它还不熟悉,可以阅读JNI规范(JavaNativeInterfaceSpecifica
Wesley13 Wesley13
3年前
JAVA 关于JNI本地库加载
1.调用JNI的时候,通常我们使用System.loadLibrary(Stringlibname)来loadJNIlibrary,同样也可以使用System.load(StringfileName)来loadJNIlibrary,两者的区别是一个只需要设置库的名字,比如如果libA.so只要输入A就可以了,而libA.so的位置可以同过设置
Stella981 Stella981
3年前
Android JNI开发系列(七)访问数组
JNI访问数组JNI中的数组分为基本类型数组和对象数组,它们的处理方式是不一样的,基本类型数组中的所有元素都是JNI的基本数据类型,可以直接访问。而对象数组中的所有元素是一个类的实例或其它数组的引用,和字符串操作一样,不能直接访问Java传递给JNI层的数组,必须选择合适的JNI函数来访问和设置Java层的数组对象。
Wesley13 Wesley13
3年前
C和C++函数时的JNI使用区别
Java调用C和C函数时的JNI使用区别:注意:jni.h头文件中对于\\\.c & \\\.cpp采用不同的定义在C的定义中,env是一个两级指针,而在C的定义中,env是个一级指针C形式需要对env指针进行双重deferencing,而且须将env作为第一个参数传给jni函数jclass(JNICALL\
Stella981 Stella981
3年前
ImageMagick高清压缩图片
之前有写过imageMagick压缩图片的文章,但是那篇文章中用到的是jmagick。JMagick是一个开源API,利用JNI(JavaNativeInterface)技术实现了对ImageMagick(http://www.oschina.net/project/847)API的Java访问接口,因此也将比纯Java实现的图片操作函数在