精华内容
下载资源
问答
  • 该文档内记录了java调用动态库的详细过程,用jna,调用
  • java调用动态库实例

    2017-02-17 11:51:52
    包括java调用动态库的实例与总结,其中有jna调用动态库和jnative调用动态库,分为直接java文件main方法调用和web项目中的servlet调用两种方法
  • JAVA调用动态库必备jar包,对于java调用C提供的dll动态库调用
  • java调用c++动态库例子,NetSdk.dll 文件拷贝至JDK/bin目录下
  • Java调用动态库dll的方法一文的源代码
  • gmssl国密工具箱中 Java模块编译的动态库,是在windows64位机器上编译的,通过JNI可以调用SM2加密解密签名验签
  • Java调用动态库.pdf

    2021-10-08 00:25:42
    Java调用动态库.pdf
  • 海康威视 综合安防管理平台8700 java调用C++接口,提供录像下载相关功能! maven项目,Eclipse导入注意!
  • Java调用动态库最简便方法.pdf
  • Java调用动态链接 Java 调用 DLL 源码
  • Java调用动态库[收集].pdf
  • 重难点之Java调用动态库.pdf
  • Java调用动态库方法说明
  • java调用动态库dll/so(一)前言

    千次阅读 2019-05-21 14:43:27
    java作为一种开源语言与C++编译和运行过程有着本质的不同,然而在java语言里是可以调用C/C++动态链接的,常用的技术手段有jni和jna。 jni与jna比较 相比较而言,jni使用复杂,jna使用简单。 jni(Java Native ...

    前言

    java作为一种开源语言与C++编译和运行过程有着本质的不同,然而在java语言里是可以调用C/C++动态链接库的,常用的技术手段有jni和jna。

    jni与jna比较

    相比较而言,jni使用复杂,jna使用简单。

    jni(Java Native Interface java本地接口):如果有一个现有的.dll/.so文件,使用JNI技术调用,我们首先需要另外使用C语言写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的  dll/so中公布的函数。然后再在Java中载入这个适配器dll/so,再编写Java   native函数作为dll中函数的代理。经过2个繁琐的步骤才能在Java中调用本地代码。因此,很少有Java程序员愿意编写调用dll/.so库中的原生函数的java程序。这也使Java语言在客户端上乏善可陈。可以说JNI是Java的一大弱点!

    jna(Java Native Access java本地访问):提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll,Android的so)而不需要编写任何Native/JNI代码。开发人员只要在一个Java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。

    性能比较:jni > jna,实验参考https://blog.csdn.net/drifterj/article/details/7841810

    综上比较我们采用jna技术实现调用动态库。在maven工程pom文件中配置jna依赖即可,版本信息可点击主页查看发布的最新版本号:

    <dependency>
    	<groupId>net.java.dev.jna</groupId>
    	<artifactId>jna</artifactId>
    	<version>5.3.1</version>
    </dependency>

    jna github主页:https://github.com/java-native-access/jna

    开发前准备

    以下工具用来进行调试前对所需引用的动态库进行依赖查看,防止出现找不到指定模块的异常,使用方法暂且可以不看,后续使用过程中再来详查。

    系统

    平台

    描述工具名称使用方法
    linux

    依赖

    查看

    qt命令行工具

    1.打开qt命令行工具,如下图所示;

    2.进入动态库所在目录;

    3.使用windeployqt xxx.so直接复制当前库依赖,xxx.so为自己的库

    windows

    depends.exe

     

    1.打开软件

    2.直接拖拽动态库dll文件至软件

    工具下载:

    【depends.exe】链接:https://pan.baidu.com/s/13pRu5SF1R_r2swVnAsaNtQ 提取码:9iss 

    【qtcreator自带msvc2017和mingw-x64编译器】 链接:https://pan.baidu.com/s/1kJ69v4bU44ZDb23tFrdlLA 提取码:dgq1 

    展开全文
  • java 调用动态库

    2008-11-01 19:56:53
    提供两种方法调用动态库 jnative + jni
  • 利用JNative实现Java调用动态库.pdf
  • Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回-附件资源
  • java调用C++ 动态库方法

    千次阅读 2019-04-11 15:15:06
    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类   ...

    摘要: 最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。 1、第一步,先在Java中新建一个类     如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了。

    最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题。经过查找,实现了一个简单的例子。

    1、第一步,先在Java中新建一个类

       

    如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了。然后我们需要dll中实现下面定义的加减乘除方法。

    2、编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是eclipse,这个文件已经自动生成了,在工程目录下的bin文件夹下。用命令行编译,打开cmd窗口,cd到.java文件所在目录,执行命令javac Java2cpp.java,即生成Java2cpp.class

    然后执行命令javah Java2cpp生成Java2cpp.h头文件,但是这一步往往会失败,另一种方法可以成功,进入eclipse项目的目录,进入bin文件夹,执行命令javah -classpath . -jni 包名.类名(com.test.jni.Java2cpp),然后生成了com_test_jni_Java2cpp.h

    3、在VS中新建项目win32项目,命名为:TestJNI第二步选择如下:

    4、把第二步生成的头文件拷进项目文件夹,然后导入。

    5、实现头文件中的方法:

    (1)新建头文件dllApi.h,代码如下:

    #include "com_test_jni_Java2cpp.h"
    
    int DLL_API_ADD(int a, int b);
    int DLL_API_SUB(int a, int b);
    int DLL_API_MUL(int a, int b);
    int DLL_API_DIV(int a, int b);

     

    (2)新建dllApi.cpp实现上述方法,代码如下:

    复制代码

    复制代码

    #include "stdafx.h"
    #include <iostream>
    #include "dllApi.h"
    
    int DLL_API_ADD(int a, int b)
    {
      return (a + b);
    }
    
    int DLL_API_SUB(int a, int b)
    {
      return (a - b);
    }
    
    int DLL_API_MUL(int a, int b)
    {
      return (a*b);
    }
    
    int DLL_API_DIV(int a, int b)
    {
      return (a / b);
    }

    复制代码

    复制代码

     

    (3)在TestJNI.cpp中添加代码实现com_test_jni_Java2cpp.h方法,添加完之后代码如下:

    复制代码

    复制代码

    // TestJNI.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include "TestJNI.h"
    #include "com_test_jni_Java2cpp.h"
    #include "dllApi.h"
    // 这是导出变量的一个示例
    TESTJNI_API int nTestJNI=0;
    
    // 这是导出函数的一个示例。
    TESTJNI_API int fnTestJNI(void)
    {
      return 42;
    }
    
    // 这是已导出类的构造函数。
    // 有关类定义的信息,请参阅 TestJNI.h
    CTestJNI::CTestJNI()
    {
      return;
    }
    
    JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1ADD(JNIEnv *env, jobject obj, jint a, jint b){
      int var = 0;
      var = DLL_API_ADD(a, b);
      return var;
    }
    
    JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1SUB(JNIEnv *env, jobject obj, jint a, jint b){
      int var = 0;
      var = DLL_API_SUB(a, b);
      return var;
    }
    
    JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1MUL(JNIEnv *env, jobject obj, jint a, jint b){
      int var = 0;
      var = DLL_API_MUL(a, b);
      return var;
    }
    
    JNIEXPORT jint JNICALL Java_com_test_jni_Java2cpp_DLL_1DIV(JNIEnv *env, jobject obj, jint a, jint b){
      int var = 0;
      var = DLL_API_DIV(a, b);
      return var;
    }

    复制代码

    复制代码

     

    (4)生成dll,在项目文件夹下的Debug文件夹内可以找到TestJNI.dll,但是因为我们在Java里要求dll名为JavaCallcpp,所以此时把项目重命名为JavaCallcpp,然后重新生成JavaCallcpp。【这一步生成会失败,按照如下添加路径】

    6 调用方法

    把第五步生成的JavaCallcpp.dll拷进JRE安装路径下的bin文件夹内,运行java程序即可。结果如下:

    展开全文
  • 一、加载的前提准备 加载动态库之前需要明白一下几个避坑点: 动态库本身使用32位编译器编译,则只能在32操作... 若在windows上加载,所需要加载动态库依赖的第三方动态库中缺少系统api,如api-ms-win-core-xxx....
    • 一、加载的前提准备

    加载动态库之前需要明白一下几个避坑点:

    1. 动态库本身使用32位编译器编译,则只能在32操作系统上加载成功;同理,若动态库本身为64位编译器编译,则只能在64位操作系统上加载成功;
    2. 动态库本身所需的一级依赖必须在本机上具有,不缺失,即:不缺少依赖;
    3. 若在windows上加载,所需要加载动态库依赖的第三方动态库中缺少系统api,如api-ms-win-core-xxx.dll这些库,可不用理会,不影响加载,但运行时可根据接口使用情况进行判断是否需要解决缺失依赖;
    4. 在使用Native.load(String name, Class<T> interfaceClass)加载动态库时,name变量不需要加.so或者.dll后缀,且若是linux下加载.so动态库,lib前缀也省略,例如需要加载libCTest.so这个库,则name=CTest即可。(原因是源码内部根据操作系统类型已自动帮你添加lib前缀,自动填充了.so、.dll后缀)
    • 二、依赖解决方式

    依赖的解决有两种:

    1. 将依赖拷贝至系统环境bin目录下并注册,具体的位置以windows举例,32位拷贝至C:\Windows\System32下,64位拷贝至C:\Windows\SysWOW64\downlevel。(作参考,可谷歌,未实践此方法);
    2. 将依赖拷贝至动态库同级目录下。(本文采用此方式)

    查看依赖的工具可参考之前的文章:jna使用之(一)java调用动态库dll/so-知识准备

    • 三、jna加载动态库路径问题

    jna加载动态库具有多种方式,主要有以下三种:

    (1).依赖库在项目的\target\classes下,即,建立工程时,将依赖库拷贝至在maven工程的src/main/resources;

    (2).在maven工程的src/main/resources下建立系统文件夹名,并拷贝依赖至此,这里只列举linux和windows下文件夹名称情况。

    系统位数文件夹名
    linux32linux-x86
    64linux-x86-64
    windows32win32-x86
    64win32-x86-64

    (3).指定路径模式,此方法需要配置动态库根目录,即"jna.library.path"环境变量(本文采用此方式)。

    • 四、加载框架实现

    我的加载框架实现主要由注解、接口、加载实现三个部分完成,在实际开发过程中,用户只需要定义接口,并给接口上使用我们定义的注解,并拷贝动态库之指定位置即可。具体代码如下解析:

    1.注解

    linuxNam和windowsName指的是动态库在两个系统下的名称,无前后缀。

    package maoko.dllSolibLoad.lib.load;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * lib接口注解
     * 
     * @author maoko
     *
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface LibLoad {
    	/**
    	 * linux lib 名称
    	 * 
    	 * @return
    	 */
    	String linuxName() default "";
    
    	/**
    	 * windows lib 名称
    	 * 
    	 * @return
    	 */
    	String windowsName() default "";
    }
    

    2.加载实现-JnaLibCall 

    使用到了反射扫描指定的LIBPACKAGE包下的接口,获取定义注解LibLoad的动态库名称,进行加载;在函数setJnaLibPath()中预配置jna.library.path系统属性,使jna在指定的地方进行加载.so/.dll。

    package maoko.dllSolibLoad.lib.load;
    
    import java.util.Set;
    
    import com.sun.jna.Library;
    import com.sun.jna.Native;
    
    import maoko.common.ClassUtil;
    import maoko.common.file.PathUtil;
    import maoko.common.log.IWriteLog;
    import maoko.common.log.Log4j2Writer;
    import maoko.common.model.enm.EOsType;
    import maoko.common.system.AppRunPathUitl;
    import maoko.common.system.OSPlatformUtil;
    
    /**
     * lib动态库调用方法:dll/so file mast have lib prefix
     * 
     * @author fanpei
     * @date 2019年5月22日下午4:49:43
     */
    public class JnaLibCall {
    	private static final String LIBPACKAGE = "maoko.dllSolibLoad.lib.load.ifs";// 接口目录,根据自己的动态库接口所在包名进行修改
    
    	private static final IWriteLog log = new Log4j2Writer(JnaLibCall.class);
    
    	private static final String JNA_LIBRARY_PATH = "jna.library.path";
    	private static final String WINDOWS_LIB_PATH = "lib/windows";// local dll file location
    	private static final String LINUX_LIB_PATH = "lib/linux"; // local so file location
    	private static final String WINDOWS_SEPRATOR = ";";
    	private static final String LINUX_SEPRATOR = ":";
    
    	/**
    	 * 加载
    	 * 
    	 * @throws Exception
    	 */
    	public static void load() throws Exception {
    
    		EOsType ostype = OSPlatformUtil.getOSType();
    		setJnaLibPath(ostype);
    		// 加载dll
    		Set<Class<?>> clazzs = ClassUtil.getClasses(LIBPACKAGE, LibLoad.class, false);
    		if (clazzs != null) {
    			for (Class<?> dllclass : clazzs) {
    				Library libtmp = null;
    				@SuppressWarnings("unchecked")
    				Class<Library> clazzLib = (Class<Library>) dllclass;
    				LibLoad dllName = dllclass.getAnnotation(LibLoad.class);
    				try {
    					String libname = "";
    					if (EOsType.Linux == ostype) {
    						libname = dllName.linuxName();
    					} else// windows
    					{
    						libname = dllName.windowsName();
    					}
    					libtmp = Native.load(libname, clazzLib);
    					LibFactory.add(dllclass.getName(), libtmp);// 加入自定义库工厂,用于后续根据名字调用
    					log.info("loading lib:{} sucessful", dllclass.getName());
    				} catch (Throwable e) {
    					log.warn("load lib file faied:{}", e);
    				}
    			}
    			log.info("loaded lib count:{}", LibFactory.totalLib());
    		}
    	}
    
    	/**
    	 * 设置jna加载指定路径
    	 * 
    	 * @param ostype 系统类型
    	 */
    	private static void setJnaLibPath(EOsType ostype) {
    		String appPath = AppRunPathUitl.getAppRunPath();
    		String libRootPath = "";
    		String libPath = "";
    		// String nameEnd = "";
    		String seprator = "";
    		if (EOsType.Linux == ostype) {
    			libPath = LINUX_LIB_PATH;
    			// nameEnd = LINUX_DLL;
    			seprator = LINUX_SEPRATOR;
    		} else// windows
    		{
    			libPath = WINDOWS_LIB_PATH;
    			// nameEnd = WINDOWS_DLL;
    			seprator = WINDOWS_SEPRATOR;
    		}
    		libRootPath = PathUtil.combinePath(appPath, libPath);
    		String jnaPath = System.getProperty(JNA_LIBRARY_PATH);
    		System.err.println("jna.library.path:" + jnaPath);
    		if (jnaPath == null) {
    			jnaPath = libRootPath;
    		} else if (!jnaPath.contains(libRootPath))
    			jnaPath = jnaPath + seprator + libRootPath;
    		System.setProperty(JNA_LIBRARY_PATH, jnaPath);
    		System.setProperty("jna.debug_load", "true");//启用jna调试日志输出
    		System.err.println("the latest jna.library.path:" + System.getProperty(JNA_LIBRARY_PATH));
    	}
    
    }
    

    代码完整地址:https://download.csdn.net/download/fanpei_moukoy/11195072

                             https://github.com/maokofan/maoko.dllSoLibLoad

     

    展开全文
  • Jnative1.4_java调用动态库所需jar,里面包含了一个可以测试的动态库,可以自己拿下来玩玩。
  • java调用动态库时,.dll文件路径问题

    万次阅读 2016-05-09 09:54:27
    网上说”.dll”应该放在”.class”同级目录下,但经测试,...当放到java工程同级目录时,一个例子可以调用: 当我调用vtk测试用例时,却又显示“no java.library.path”。后期这样解决的: 1.右击项目,从弹出的右

    网上说”.dll”应该放在”.class”同级目录下,但经测试,程序报错:
    “java.lang.UnsatisfiedLinkError: no JniDllDemo in java.library.path”
    dll与class同级目录
    出现问题

    当放到java工程同级目录时,一个例子可以调用:
    dll与java工程同级目录
    程序运行结果

    当我调用vtk测试用例时,却又显示“no java.library.path”。后期这样解决的:
    1.右击项目,从弹出的右键菜单中选择“Properties”
    2.从左侧列表中找到“Java Build Path”,然后选择右侧的“libraries”选项卡,点击“JRE System Library”
    3.在“Native library location”中添加”.dll”所在文件夹路径
    添加dll路径

    代码链接:java调用vtk的dll工程

    展开全文
  • Linux下JAVA调用C++动态库

    千次阅读 2020-02-12 18:41:11
    公司项目要求对接腾讯云的实时音视频(Tencent Real-Time Communication,TRTC),其开发语言是C++,需...*libTRTCEngine.so* C++业务实现底层核心代码编译而成的动态库文件。 *recordsdk.i* swig接口文件,c++转jav...
  • java调用动态库(Jnative).zip
  • Java调用动态库

    千次阅读 2008-07-23 16:13:00
    记得以前 Java调用C/C++写得动态库都是用的 JNI 方式,还需要自己写不少 C/C++ 代码。比如说要在Java调用已有的动态库,如 Windows 的 user32.dll 的方法 MessageBoxA,具体步骤是 Java 中声明一个 native 方法...
  • 此附件包含了java代码以及vs2013编写的动态库工程。
  • 生成及调用动态库生成及调用动态库生成及调用动态库生成及调用动态库生成及调用动态库生成及调用动态库
  • PAGE / NUMPAGES Java调用动态链接.DLL) .dll文件用一般使用何种语言何种软件编写 .dll文件一般用 C语言VC++DelphiC#等语言和相应的 开发工具编写如果要考虑广泛的兼容一般使用VC++或者C语言编写可供...
  • java使用jna调用动态库踩的坑

    千次阅读 2019-07-19 23:44:51
    回顾去年项目需求上需要使用算法封装好的动态库,楼楼使用的是jna调取动态库。开发过程中,就是一个爬坑之旅,在此记录下爬过的坑。 1.位数问题 使用jna需要关注到动态库位数,服务器系统位数,为此选定合适的jdk。...
  • 经过网上查找的资料和实践,可以在java界面中点击按钮调用C的程序将结果显示到java的文本框中,里面有代码和步骤,祝你成功~~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 233,839
精华内容 93,535
关键字:

java调用动态库

java 订阅