JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法;JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK、JIR环境下运行不了,在VMware下安装的WindowsXP下同样有问题;JNative是开源的,但相关资料文档也特别的少,好像已经停止更新了。JNative源码地址:http://jnative.cvs.sourceforge.net/viewvc/jnative/,jar包下载地址:http://sourceforge.net/projects/jnative/files/jnative/。
开发环境:myeclipse-10.7-offline-installer-windows
文件》新建》JAVA项目:
输入项目名称,单击“Finish”:
单击鼠标右键》新建》类:
输入包名,类名,勾选“public static void main(String[] args)”,单击“Finish”:
打开项目文件目录:
将要调用的DLL文件“EhfscliaxDll.dll”复制到此目录下,该DLL的代码请参考:VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性
新建“lib”文件夹,将JNative.jar复制到此目录下:
配置编译目录:
单击“Add External JARs”添加jar包,下图为已经添加过的:
Helper类代码:
package com.ehfscliax;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
public class Helper {
/**
* @param args
* @throws NativeException
*/
public static void main(String[] args) throws NativeException {
JNative.setLoggingEnabled(true);
try {
JNative getUrl = new JNative("EhfscliaxDll.dll", "getUrl"); //创建 getUrl 方法的JNative对象
getUrl.setRetVal(Type.STRING); //设置返回值类型为:String
getUrl.setParameter(0, "127.0.0.1"); //按顺序设置方法需要的参数值
getUrl.setParameter(1, 10087);
getUrl.setParameter(2, 123);
getUrl.invoke(); //调用方法
System.out.println(getUrl.getRetVal()); //输出返回值
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
JNative getPlayUrl = new JNative("EhfscliaxDll.dll", "getPlayUrl");
getPlayUrl.setRetVal(Type.INT); //此方法在DLL中定义的返回值类型为:const wchar_t*,如果设置返回值类型为:String,则只能获取到返回值的第一个字符
String mgrIp = "127.0.0.1";
Pointer ptr = Pointer.createPointerFromString(mgrIp);
getPlayUrl.setParameter(0, ptr);
getPlayUrl.setParameter(1, 10087);
getPlayUrl.setParameter(2, 123);
getPlayUrl.invoke();
//个人理解getRetValAsInt是获取返回值的指针地址,getUnicodeMemoryAsString方法从指针地址的内存中读取字符串
String url = JNative.getUnicodeMemoryAsString(getPlayUrl.getRetValAsInt());
System.out.println(url);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
执行结果:
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library 'EhfscliaxDll.dll', functionName = getUrl: hModule = 268435456
http://中文127.0.0.1:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.pointers.memory.MemoryBlockFactory] [setPreferredMemoryType]: Using org.xvolks.jnative.pointers.memory.HeapMemoryBlock memory reservation strategy
http://-�17001:10087
2014-5-25 22:48:46, [DEBUG] [org.xvolks.jnative.JNative] [unLoad]: Unloading native library 'EhfscliaxDll.dll'
getUrl方法的返回值类型为:const char*,结果是正常的,getPlayUrl的返回值类型为:const wchar_t*,虽然通过getUnicodeMemoryAsString读取到了返回值,不是第一个字符,但中文乱码的问题一直没能解决。
本学习项目源码下载:http://download.csdn.net/detail/testcs_dn/7400203
分享到:
相关推荐
`JNative` 是一个用于Java调用本地代码(如DLL)的开源库,它提供了一个方便的接口,使得Java程序员可以轻松地与动态链接库进行交互。本教程将围绕如何使用`JNative`来调用DLL进行深入讲解。 首先,我们要理解Java...
在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了简化这一过程,JNative框架...
此时,我们通常需要借助于本地代码,也就是C、C++编写的动态链接库(DLL,Windows下)或共享库(Linux下)。JNative是一个Java库,它为Java程序员提供了一种直接调用这些本地代码的能力,无需通过JNI(Java Native ...
4. **libJNativeCpp.so**:这是针对Linux平台的动态链接库,表明JNative库也支持Linux环境,但具体使用方法可能与Windows有所不同。 使用JNative调用Win32 API的基本步骤如下: 1. 在Java代码中声明native方法,...
在Java程序中调用DLL(动态链接库)文件通常是通过JNI(Java Native Interface)来实现的,而JNative是JNI的一个封装库,它提供了一种更简洁的方式来调用C/C++编写的本地代码。这篇博客文章可能介绍了如何利用...
在Java编程环境中,有时我们需要与本地系统资源进行交互,例如调用C或C++编写的动态链接库(DLL)。为了实现这一目标,开发者可以利用Java的JNI(Java Native Interface)或者第三方框架,如jnative。本篇文章将详细...
Java本地接口(JNI)是Java平台提供的一种原生方法调用机制,允许Java代码与用其他编程语言(如C++)编写的动态链接库(DLL)进行交互。在这个场景中,我们关注的是JNative,一个简化Java调用C/C++库的开源库。 ...
1. **Java调用动态链接库的基本流程**: - 首先,你需要一个C/C++编写的本地方法,该方法定义了要调用的DLL函数。 - 使用JNI头文件生成对应的Java本地接口(JNI)代码,这些代码包含了Java调用本地方法的接口定义...
Java调用DLL的工具JNative是为了解决Java应用程序与本地动态链接库(DLL)交互问题而设计的一个开源组件。在传统的Java开发中,如果需要调用非Java编写的库,比如C或C++编译的DLL,通常会使用JNI(Java Native ...
标题中的“jnative调用动态库”指的是Java中使用JNative库来调用本地(操作系统级别的)动态链接库(DLL或SO文件)的技术。在Java中,为了与操作系统底层功能进行交互,比如调用C/C++编译的库,我们可以使用Java ...
标题中的“JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用”涉及到的是Java平台下通过JNI(Java Native Interface)的两种实现方式,JNA(Java Native Access)和JNative,来与C/C++编写的动态链接库(DLL)进行交互...
4. **编译本地代码**:将C/C++源文件编译为动态链接库(如.dll on Windows,.so on Linux,.dylib on macOS)。 5. **加载库并调用方法**:在Java代码的静态块中,使用`System.loadLibrary`加载本地库,然后就可以...
在Java编程中,有时我们需要利用Java来调用操作系统级别的功能,这些功能往往存在于动态链接库(DLL)中,特别是在Windows环境下。本篇文章将详细介绍如何在Java中调用动态库,主要涉及两种方法:JNative和JNI(Java...
这些方法会调用动态链接库中的功能。 3. **编译本地代码**:将C/C++源代码编译成动态链接库(在Windows上是.dll文件,在Unix/Linux上是.so文件)。 4. **加载库并注册本地方法**:在Java代码中,使用`System....
JNative是Java平台上的一个开源库,它允许Java程序直接调用C/C++编写的动态链接库,从而实现了Java与本地代码的无缝交互。本文将深入探讨如何利用JNative调用DLL进行开发,以及相关的API和示例。 首先,JNative的...
### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...
本教程将通过一个简单的例子来演示如何使用JNI调用DLL动态链接库。 首先,我们需要理解JNI的工作原理。JNI提供了一套接口,使得Java代码可以通过这些接口来调用本地(Native)代码,这里的本地代码可以是C、C++等...
在Java编程环境中,有时我们需要利用C或C++编写的动态链接库(DLL)文件来扩展功能,这通常涉及到跨语言的交互。Java本身并不直接支持加载和调用DLL,但可以通过第三方库如JNative来实现这一目标。本文将详细介绍...
这个压缩包文件提供了关于如何在Java中调用C/C++编写的动态链接库(DLL)的示例,以及反向操作,即在C/C++中调用DLL。让我们详细探讨这些关键知识点。 首先,`JNA.jar`(Java Native Access)是Java平台上的一个...
Java 调用动态库是 Java 语言中的一种技术,用于调用动态链接库(DLL),从而实现与native 代码的交互。下面将详细介绍 Java 调用动态库的知识点。 一、使用 JNI 调用动态库 JNI(Java Native Interface)是一种...