JAVA调用动态链接库

上一篇《JAVA本地接口(JNI)》中介绍了JAVA的JNI技术,通过JAVA自有的方式调用动态链接库,这一篇将继续为大家介绍使用其他方式调用动态链接库。
首先,我们编写一个用于测试的链接库

头文件 print.h

#ifdef DLL_IMPLEMENT  #define DLL_API __declspec(dllexport)  
#else  #define DLL_API __declspec(dllimport)  
#endif #ifndef _Included_PRINT#define _Included_PRINT#ifdef __cplusplusextern "C" {#endifDLL_API void print();DLL_API void print2(int i);DLL_API int print3(int i);#ifdef __cplusplus}#endif
#endif

源文件 print.c

#define DLL_IMPLEMENT 
#include <stdio.h>
#include "print.h"
DLL_API void print()
{printf("invoke print...");
}
DLL_API void print2(int i)
{printf("invoke print %d...", i);
}
DLL_API int print3(int i)
{return i;
}

使用c编译器对其进行编译:cl -LD print.c -Feprint.dll
然后我们将生成的print.dll放在系统的system32文件夹下,至此准备工作完成。

JNative

JNative是Java to native interface的缩写,使用JNative,我们可以很方便的调用动态链接库,使用示例如下:

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;public class JNativeTest
{public static void main(String[] args) throws Exception{// 加载动态链接库JNative print = new JNative("print.dll", "print");// 执行函数print.invoke();JNative print2 = new JNative("print.dll", "print2");// 设置函数形参print2.setParameter(0, 2);print2.invoke();JNative print3 = new JNative("print.dll", "print3");// 设置返回值类型print3.setRetVal(Type.INT);print3.setParameter(0, 3);print3.invoke();// 获得运行结果String result = print3.getRetVal();System.out.println("print3:" + result);}
}

下面再给出一个使用JNative获得系统时间的示例:

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.misc.basicStructures.AbstractBasicData;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.util.Kernel32.SystemTime;public class JNativeDemo extends AbstractBasicData<JNativeDemo>
{public short wYear;public short wMonth;public short wDayOfWeek;public short wDay;public short wHour;public short wMinute;public short wSecond;public short wMilliseconds;/*** 分配内存,并返回指针*/public Pointer createPointer() throws NativeException{pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(getSizeOf()));return pointer;}/*** 内存大小*/public int getSizeOf(){return 8 * 2;}/*** 获取通过内存指针解析出结果*/public JNativeDemo getValueFromPointer() throws NativeException{wYear = getNextShort();wMonth = getNextShort();wDayOfWeek = getNextShort();wDay = getNextShort();wHour = getNextShort();wMinute = getNextShort();wSecond = getNextShort();wMilliseconds = getNextShort();return this;}public JNativeDemo() throws NativeException{super(null);createPointer();}public String toString(){return wYear + "/" + wMonth + "/" + wDay + " at + " + wHour + ":"+ wMinute + ":" + wSecond + ":" + wMilliseconds;}public static SystemTime GetSystemTime() throws NativeException,IllegalAccessException{// 创建对象JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");SystemTime systemTime = new SystemTime();// 设置参数nGetSystemTime.setParameter(0, systemTime.getPointer());nGetSystemTime.invoke();// 解析结构指针内容return systemTime.getValueFromPointer();}public static void main(String[] args) throws NativeException,IllegalAccessException{System.err.println(GetSystemTime());}
}

JNA

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

使用示例:

import com.sun.jna.Library;
import com.sun.jna.Native;public class JNADemo
{// 定义接口CLibrary,继承自com.sun.jna.Librarypublic interface CLibrary extends Library{// 定义并初始化接口的静态变量CLibrary Instance = (CLibrary) Native.loadLibrary("print", CLibrary.class);// 函数声明void print();void print2(int i);int print3(int i);}public static void main(String[] args){CLibrary.Instance.print();CLibrary.Instance.print2(2);System.out.println("print3:" + CLibrary.Instance.print3(3));}
}

JNative和JNA都可以实现对DLL的调用,但二者各有优缺点,需要根据实际情况选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组重复次数最多的元素递归_在不使用递归的情况下计算链接列表中元素的出现次数...

数组重复次数最多的元素递归Solution: 解&#xff1a; Input: 输入&#xff1a; A singly linked list whose address of the first node is stored in a pointer, say head and key is the data of which we have to count the number of occurrences. 一个单链表 &#xff…

DshanMCU-R128s2芯片外设支持列表

LCD 显示屏 厂商分辨率型号接口FPS100ask480 x 320Dshan_Display ModuleSPI60 摄像头 Sensor 厂商分辨率型号Size接口FPSGalaxyCoreVGA, 640 x 480GC03081/6.5DVP30GalaxyCoreUXGA, 1616 x 1232GC21451/5DVP13

第6周 搜索与排序

1 查找里程 给你这样一张里程表&#xff0c;如何写一个程序&#xff0c;输入两地的地名&#xff0c;能输出期间的里程&#xff1f; #include <stdio.h> #include <string.h> #define C_LEN 30typedef struct city {char name1[C_LEN];char name2[C_LEN];int distan…

(转) Twisted :第十九部分 改变之前的想法

2019独角兽企业重金招聘Python工程师标准>>> 简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 Deferred 类添加了一个新的特性—— cancellation ——这正是我们今天要研究的. 异步编程将请求和响…

stl list 删除元素_删除所有出现的元素,并从列表中删除一些特定的元素。 C ++ STL...

stl list 删除元素list.remove()和list.remove_if()函数 (list.remove() and list.remove_if() functions) remove() function is used to remove all occurrences of a given element from the list and function remove_if() is used to remove set of some specific element…

Mac 获取 Brew

2019独角兽企业重金招聘Python工程师标准>>> 终端输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 转载于:https://my.oschina.net/fdstudio/blog/610680

express 项目生成器_用于项目的Express模板生成器(2)| 应用程序结构研究

express 项目生成器Hello! In express template generator for your projects (1), we looked at express generator and how we can start an express application with stressing to build a brand new structure of all required files. 你好&#xff01; 在针对您的项目的E…

简单的block

int multi 7; int (^myBlock)(int) ^(int num){ return num * multi; }; int result myBlock(5); NSLog("结果是&#xff1a;%d",result);//输出结果是&#xff1a; 结果是&#xff1a;35 void (^printBlock)(NSS…

c# 浮点数十六进制字符串_从C#中包含十六进制值的字符串数组中打印整数值...

c# 浮点数十六进制字符串将十六进制字符串数组转换为整数 (Converting array of hexadecimal strings to integers) Let suppose you have some of the strings (i.e. array of strings) containing hexadecimal values like "AA", "ABCD", "ff21&quo…

Linux 服务器中文乱码编码解决

Linux环境的ECS中&#xff0c;若出现如下中文显示为乱码的情况。 一般原因如下: 1. 未安装中文语言包 2. 未设置正确的默认语言 3. SSH 终端未正确配置 本文以Centos 6.5为例&#xff0c;演示如何解决中文乱码问题。 1. 使用 locale -a |grep zh_CN查看系统是否已经安装…

Python | 如何强制除法运算为浮点数? 除数一直舍入为0?

Until the python version 2, the division of two integers was always being rounded down to 0. 在python版本2之前&#xff0c; 两个整数的除法总是四舍五入为0 。 Consider the below example, being executed in python version 2.7, 考虑下面的示例&#xff0c;该示例在…

Python程序输入一个字符串并查找总数的大写和小写字母

Given a string str1 and we have to count the total numbers of uppercase and lowercase letters. 给定字符串str1 &#xff0c;我们必须计算大写和小写字母的总数。 Example: 例&#xff1a; Input: "Hello World!"Output:Uppercase letters: 2Lowercase lette…

Android(Xamarin)之旅(三)

原文:Android&#xff08;Xamarin&#xff09;之旅&#xff08;三&#xff09;前面两篇说到了Xamarin的安装和一些简单的控件&#xff0c;今天来说说一些对话框和提示信息&#xff0c;以及简单的布局元素。 一、对话框和提示信息 一、对话框 我们首先从简单的对话框开始。 1、普…

java中为按钮添加图片_我们可以在Java接口中为成员定义私有和受保护的修饰符吗?...

java中为按钮添加图片No, it is not possible to define private and protected modifiers for the members in interfaces in Java. 不可以&#xff0c;无法为Java接口中的成员定义私有修饰符和受保护的修饰符。 As we know that, the members defined in interfaces are imp…

android Monkey 测试技巧

MonkeyTest 测试流程1、常用的命令参数说明&#xff1a;-sseed值&#xff0c;设置这个参数的主要作用是程序员可以重复执行这个命令&#xff0c;seed值相同则monkey测试序列也大致一样。-p 指定要测试的包&#xff0c;参数跟的是apk的package id--pct-touch 调整触摸…

十六进制数制到二进制,八进制和十进制数制的转换

Prerequisite: Number systems 先决条件&#xff1a; 数字系统 1)将十六进制数制转换为二进制数制 (1) Conversion of Hexadecimal Number System to Binary Number System) To convert hexadecimal numbers into binary numbers, we can use the relationship between hexade…

ldo regula_使用C中的Regula Falsi方法找到复多项式方程的根

ldo regulaRegula Falsi方法 (Regula Falsi method) About the method: 关于方法&#xff1a; We often hear many children and even many adults complaining about the difficulty level that they face while solving complex polynomial equations. It is also difficult…

解决一次由于SSL证书到期导致的网站不能访问的问题(Nginx,php,Apache)

1. 现象放假期间收到zabbix报警&#xff0c;提示主站访问不了&#xff0c;报502。2.排查思路及过程因为是过年休息&#xff0c;放假前又没有更新&#xff0c;基本可以排除是更新和配置导致的问题。ssh连上服务器发现服务器连接和资源都没问题。这是一套lnamp架构的网站&#xf…

python字典按键值排序_在Python中按键或值按升序和降序对字典排序

python字典按键值排序Problem Statement: Write a Python program to sort (ascending and descending) a dictionary by key or value. 问题陈述&#xff1a;编写一个Python程序&#xff0c;以按键或值对字典进行排序(升序和降序)。 Example: 例&#xff1a; Input: diction…

Try Redis : Redis 入门教程

开篇 Redis 是一种以键值对&#xff08;key-value&#xff09;存储数据的NoSQL数据库。 键值对存储数据的本质是以某个键存储某个值。之后你可以用这个键把存储的值取出来。可以用SET命令以键‘servername’存储值‘fido’&#xff1a; SET servername fido这样&#xff0c;数据…