JNI,JNA,Jnative

2024-06-13 16:18
文章标签 jni jna jnative

本文主要是介绍JNI,JNA,Jnative,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先说下JAVA调用DLL,Java调用DLL的常用方法大致为几种,JNI,JNA,Jnative等,但实现与易用性差距还是很大,1.JNI用的人比较多,但相对来说比较麻烦要熟悉c并且要使用javac 及javah命令,步骤繁琐2.JNA,Jnative相对简单只需要用实现接口,使用相对简单,但无论使用什么调用dll文件,比较令人头疼的都是JAVA与C之间类型对应与值对应。下面我将项目中对着JNA及jnative的使用总结下。 



1.JNA样码 


步骤如下: 


a,下载JNAjar文件,拷贝至系统根目录或者系统system32下 

b,代码很easy 

Java代码   收藏代码
  1. package com.cn.app;  
  2.   
  3. import com.sun.jna.Library;  
  4. import com.sun.jna.Native;  
  5.   
  6. public class DLLTEST {  
  7.   
  8.     // 1.实现PegRoute.dll 文件接口  
  9.       
  10.     public interface PegRoute extends Library {  
  11.   
  12.         // 2.PegRoute.dll 中 HCTInitEx方法  
  13.         public int HCTInitEx(int Version, String pStrCurrentDirectory);  
  14.     }  
  15.       
  16.     public static void main(String[] args) {  
  17.                  //3.加载DLL文件,执行dll方法    
  18.         PegRoute epen = (PegRoute) Native.loadLibrary("PegRoute",  
  19.                 PegRoute.class);  
  20.         if (epen != null) {  
  21.             System.out.println("DLL加载成功!");  
  22.             int success = epen.HCTInitEx(0,"");  
  23.             System.out.println("1.设备初始化信息!" + success);  
  24.                     }  
  25.     }  
  26. }  



2.Jnative样码 

1.下载jnative。jar 及JNativeCpp.dll 
2.将使用的dll文件及JNativeCpp.dll拷贝至系统system32下 
3.样码 

Java代码   收藏代码
  1. import org.xvolks.jnative.JNative;  
  2. import org.xvolks.jnative.exceptions.NativeException;  
  3. import org.xvolks.jnative.Type;  
  4. import org.xvolks.jnative.misc.basicStructures.LONG;  
  5.   
  6. public class JNativeT {  
  7.   
  8.     static JNative PegRoute = null;  
  9.   
  10.     public String init() throws NativeException, IllegalAccessException {  
  11.         try {  
  12.             if (PegRoute == null) {  
  13.                 // 1. 利用org.xvolks.jnative.JNative来加载DLL:参数1.PegRoute为类名  
  14.                 // 2.HCTInitEx方法名  
  15.                 PegRoute = new JNative("PegRoute""HCTInitEx");  
  16.   
  17.                 // 2.设置要调用方法中的参数:0 表示第一个以此类推  
  18.                 LONG versionLong = new LONG(10);  
  19.                 versionLong.setValue(0);  
  20.   
  21.                 PegRoute.setParameter(0, Type.LONG, versionLong.toString());  
  22.                 PegRoute.setParameter(1, Type.STRING, "");  
  23.   
  24.                 // 3.设置返回参数的类型  
  25.                 PegRoute.setRetVal(Type.INT);  
  26.                 // 4.执行方法  
  27.                 PegRoute.invoke();// 调用方法  
  28.             }  
  29.             System.out.println("调用的DLL文件名为:" + PegRoute.getDLLName());  
  30.             System.out.println("调用的方法名为:" + PegRoute.getFunctionName());  
  31.             // 5.返回值  
  32.             return PegRoute.getRetVal();  
  33.         } finally {  
  34.             if (PegRoute != null) {  
  35.                 // 6.释放系统资源  
  36.                 PegRoute.dispose();  
  37.             }  
  38.         }  
  39.     }  
  40.   
  41.         public static void main(String[] args) throws NativeException,  
  42.             IllegalAccessException {  
  43.           
  44.         String mm = new JNativeT().init();  
  45.         System.out.println(mm);  
  46.     }  
  47. }  


要使用的相关jar文件都在下方。
  • jna.jar (925.9 KB)
  • 下载次数: 636
  • JNative.jar (416.3 KB)
  • 下载次数: 519
  • JNative_V1.3.zip (362.7 KB)
  • 下载次数: 722

这篇关于JNI,JNA,Jnative的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057803

相关文章

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

Linux平台下利用JNI+双向RMI实现远程推送

一、 前言  作为一种优秀的编程语言,Java在许多方面具有突出的优越性。其中,RMI技术充分展现了Java卓越的分布式计算能力,而JNI技术则体现了Java结合异种编程语言的强大能力。人们常说,RMI是“从Java到Java”,这种说法忽视了这样一个事实:Java可利用JNI技术很容易地与原有系统连接。JNI+RMI的技术解决方案极大地延伸了Java的分布式功能。  本文的写作是基于这样一种实

Android 源码中jni项目 加载so目录小结

Android 源码中jni项目 加载so目录小结 文章目录 Android 源码中jni项目 加载so目录小结一、前言二、so目录验证测试1、jni so文件错误报错(1)报错1 - 未找到so文件:(2)报错2 - so文件中未找到native方法: 2、验证的几种情况(1)apk下面的 lib/arm64/ 放置正确的so文件(2)apk下面的 lib/arm64/ 放置错误的so文

android应用程序jni访问C库

应用程序访问C库 –通过jni访问 如果应用程序,需要访问C的动态库,可以通过ndk的方式生成动态库,也可以在ubuntu中通过命令行得到动态库。本文通过命令行的方式得到动态库libhardcontrol.so 交叉编译 arm-linux-gcc -fPIC -shared hardcontrol.c -o libhardcontrol.so -I /usr/lib/jvm/java-1.

Android JNI 访问Java中的成员变量及非native方法

JNI的头文件生成及编译请参考《Android中的JNI使用指南一》 1、修改Java类中的成员变量。通过HelloJNI.java类中changeNum()本地方法来修改成员number的值。number初始化为0,通过本地方法changeNum()修改为100。HelloJNI.java类中定义如下: changeNum()在C++中的实现,如下: //修改java类中的成员变量(i

Android中的JNI使用指南一

一、简介 JNI全称是Java Native Interface(Java本地接口)单词首字母的缩写,本地接口就是指用C和C++开发的接口。由于JNI是JVM规范中的一部份,因此可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行。同时,这个特性使我们可以复用以前用C/C++写的大量代码。    开发JNI程序会受到系统环境的限制,因为用C/C++语言写出来的代码或模块,编译过

安卓实战开发之JNI再深入了解

JNI重新认识 头文件: 1.头文件中存放的是对某个库中所定义的函数、宏(define)、类型、全局变量等进行声明,它类似于一份仓库清单。若用户程序中需要使用某个库中的函数,则只需要将该库所对应的头文件include到程序中即可。 2.头文件中定义的是库中所有函数的函数原型。而函数的具体实现则是在库文件中。 3.在连接器连接程序时,会依据用户程序中导入的头文件,将对应的库函数导入到程序中。

安卓实战开发之JNI从小白到伪老白深入了解JNI动态注册native方法及JNI数据使用

前言 或许你知道了jni的简单调用,其实不算什么百度谷歌一大把,虽然这些jni绝大多数情况下都不会让我们安卓工程师来弄,毕竟还是有点难,但是我们还是得打破砂锅知道为什么这样干吧,至少也让我们知道调用流程和数据类型以及处理方法,或许你会有不一样的发现。 其实总的来说从java的角度来看.h文件就是java中的interface(插座),然后.c/.cpp文件呢就是实现类罢了,然后数据类型和ja

安卓实战开发之JNI入门及高效的配置(android studio一键生成.h,so及方法签名)

前言 以前也讲过NDK开发,但是开始是抱着好玩的感觉去开始的,然后呢会helloWord就觉得大大的满足,现在静下来想这NDK开发到底是干什么呢? NDK开发,其实是为了项目需要调用底层的一些C/C++的一些东西;另外就是为了效率更加高效些但是在java与C相互调用时平白又增大了开销(其实效率不见得有所提高),然后呢,基于安全性的考虑也是为了防止代码被反编译我们为了安全起见,使用C语言来编写

基本JNI调用技术(c/c 与java互调)

注意我就是错在这个些包的名字上,导致调用失败 1,在项目根目录下建立文件夹libs/armeabi文件夹 2,将so库放入libs/armeabi文件夹注意事项: 1,如果采用静态注册的方式请注意C文件中严格按照命名规则Java_packageName_className_method()的方式命名 2,在Android项目中建立同上述命名规则中packageName中相同的包名,在此包名