`
unifocus
  • 浏览: 7526 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

Java 调用DLL 使用Jnative

阅读更多

· 下截JNative组件

Jative.sourceforge.net/ 到这里下载JNative开源项目,我下载的是1.3.2

解压JNative-<st1:chsdate isrocdate="False" islunardate="False" day="30" month="12" year="1899">1.3.2</st1:chsdate>.zip

获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。

JNativeCpp.dll Windows下用的,拷贝到windows / system32目录下;

libJNativeCpp.so Linux下的,拷贝到系统目录下;

JNative.jar 这是一个扩展包,导入工程LIB中或将其拷贝到jdk\jre\lib\ext 下,系统会自动加载。

· 使用说明

我的项目将使用JNative组件调用一个测试应用服务器状态的TestAppSvr.dll文件,Dll文件中包含一个TestConnect()方法,返回一个整形的结果(1或0)

首先配置好JNative组件的windows环境:

将Native要用到JNativeCpp.dll放在系统盘的\WINDOWS\system32下

将JNative.jar导入工程中,新建一个调用类:

java 代码

package com.tvjody;

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

 

import org.xvolks.jnative.JNative;

import org.xvolks.jnative.Type;

import org.xvolks.jnative.exceptions.NativeException;

 

public class AppSvrTestConnect {

 

public AppSvrTestConnect() {

 

}

 

/**

* 测试应用服务器连接状态

*

* TestConnect

* @param ip 应用服务器IP

* @param port 端口

* @param intrcpt 是否采用数据压缩方式 1 :true 0:false

* @return int 1 :成功 0:失败

* @throws NativeException

* @throws IllegalAccessException

*/

private static final int TestConnect(String ip, int port, int intrcpt)throws NativeException, IllegalAccessException {

JNative n = null;

try {

n = new JNative("TestAppSvr.dll", "TestConnect");

n.setRetVal(Type.INT);

int i = 0;

n.setParameter(i++, Type.STRING, ip);

n.setParameter(i++, Type.INT, "" + port);

n.setParameter(i++, Type.INT, "" + intrcpt);

n.invoke();

return Integer.parseInt(n.getRetVal());

} finally {

if (n != null)

n.dispose();

}

}

/**

* 指定Dll文件路径,动态加载本地链接库,测试应用服务器连接状态

* setDllPath

* @param path Dll文件的路径,不包含DLL名称 例如:windows - d:\test\test\ unix - root/test/test/

* @param ip 应用服务器IP

* @param port 端口

* @param intrcpt 是否采用数据压缩方式 1 :true 0:false

* @return int 1 :成功 0:失败

* @throws NativeException

* @throws IllegalAccessException

*/

public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{

path += "TestAppSvr.dll";

System.load(path);

return TestConnect(ip,port,intrcpt);

}

/**

* Dll文件放在JRE\bin目录下面,ClassLoader就能通过System.loadLibrary()动态加载本地链接库

* TestConnectFromDllPath

* @param ip 应用服务器IP

* @param port 端口

* @param intrcpt 是否采用数据压缩方式 1 :true 0:false

* @return int 1 :成功 0:失败

* @throws NativeException

* @throws IllegalAccessException

*/

public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) throws NativeException, IllegalAccessException{

System.loadLibrary("TestAppSvr");

return TestConnect(ip,port,intrcpt);

}

}

这个类实现了一个静态私有方法,用来调用Dll文件中的方法返回结果

private static final int TestConnect(String ip, int port, int intrcpt)

两个静态公共方法,分两种方式装载DLL文件

public static final int TestConnectFromDllPath(String path,String ip, int port, int intrcpt) //通过DLL文件的路径

public static final int TestConnectFromDllPath(String ip, int port, int intrcpt) //通过ClassLoader

然后新建一个类,调用AppSvrTestConnect.java,实现方法一调用,我是将TestAppSvr.dll文件与Demo.java放在一个目录下 ,所以得到Demo.java的路径后就可以得到TestAppSvr.dll的路径,调用AppSvrTestConnect.TestConnectFromDllPath()方法后就能返回正确的信息.方法二是已经将TestAppSvr.dll放在了Jre\bin目录下,在JVM的Classloader的时候会自动加载,然后通过System.loadLibrary("TestAppSvr")就可以装配DLL文件.

java 代码

public class Demo {

public int getInfo() throws NativeException, IllegalAccessException{

 

String path=getClass().getResource(File.separator).getPath();

path = path.substring(1,path.length());

System.out.println(path); //得到DLL文件的路径

 

String ip = "192.168.0.48"; //服务器IP

int port = 221; //端口

int intrcpt = 1; //数据压缩方式传送,1为采用;0为不采用

//方法1 传入Dll文件的路径

//int info = AppSvrTestConnect.TestConnectFromDllPath(path, ip, port, intrcpt);

 

//方法2 Dll文件已经放在JRE\bin目录下面

int info = AppSvrTestConnect.TestConnectFromDllPath(ip, port, intrcpt);

 

//1为成功,0为失败

if (info == 1)

System.out.println("应用服务器可用。");

else

System.out.println("应用服务器不可用,请检查IP地址和端口是否正确。");

 

return info;

}

System.loadLibrary():装载Windows\System32下或jre\bin或Tomcat\bin目录下的本地链接库

System.load():根据具体的目录来加截本地链接库,必须是绝对路径

· 备注

上面的示例工程,因为是例子,所以没有大多的设计,只是实现了装载DLL文件,调用DLL文件方法,返回信息.

JNative的详细说明,请参考JNative的源程序和例子.

注意JVM只允许一个默认的ClassLoader来load native library,同时并不提供专门的API来unload一个loaded native library,所以在项目调试的时候,独立启动Web Server.

分享到:
评论

相关推荐

    java调用DLL:JNative

    ### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...

    在Java程序中使用JNative调用dll文件

    3. **调用DLL函数**:使用JNative提供的API,你可以直接调用DLL中的函数。例如,如果你有一个名为`myFunction`的本地方法,可以使用`JNative.callVoidMethod`或相应的函数进行调用。 4. **错误处理**:由于涉及到...

    Java调用DLL的工具 JNative

    Java调用DLL的工具JNative是为了解决Java应用程序与本地动态链接库(DLL)交互问题而设计的一个开源组件。在传统的Java开发中,如果需要调用非Java编写的库,比如C或C++编译的DLL,通常会使用JNI(Java Native ...

    JAVA调用DLL方法 JAVA调用DLL方

    ### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    YiKaTong.rar_JNative_YiKaTong.r_java jnative dll_jnative api_jna

    3. **yikatong.r.java**:这可能是项目中定义的Java源代码文件,包含了使用JNative调用DLL的Java类。在这个文件中,开发者会定义本地方法签名,然后通过JNative API来实现具体的调用。 4. **jnative.dll**:这是一...

    java调用DLL文件

    总结来说,Java调用DLL文件主要依赖于JNative库,通过定义Java接口、加载DLL、获取函数句柄、创建代理对象以及调用函数等步骤实现。这种方法使得Java开发者能够充分利用C/C++库的功能,同时也保持了Java的跨平台特性...

    JNA.jar-JNative.jar-dll创建-JAVA调用-VC调用

    5. **JAVA调用DLL**: `TestJNA.java`和`TestJNative.java`展示了如何在Java应用中使用JNA和JNative来调用`CreateDLL.dll`。JNA通过定义`Interface`来描述DLL的函数,而JNative则需要更直接地操作JNI接口。 6. **...

    JAVA调用动态链接库DLL之JNative学习源码

    本教程将围绕如何使用`JNative`来调用DLL进行深入讲解。 首先,我们要理解Java和DLL之间的交互原理。Java本身不支持直接调用本地库,但通过JNI(Java Native Interface)可以实现这种跨语言调用。JNI提供了一种方式...

    Java调用DLL源代码

    总结起来,Java调用DLL是Java与本地系统交互的重要手段,通过JNA和JNative,开发者可以在Java应用程序中利用C/C++库的功能,增强程序的能力。这两种技术各有优缺点,选择哪种取决于项目需求和开发者的技术背景。理解...

    jnative框架调用dll动态库-简单demo(带dll文件).zip

    本篇文章将详细介绍如何使用jnative框架在Java中调用DLL动态库,并提供一个简单的示例。 首先,理解jnative框架的核心概念。jnative是一个纯Java库,它提供了一种简单的方式来调用C和C++的函数,无需编写JNI头文件...

    java调用dll必备jar包

    本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的调用,因为它是一个跨平台的语言,而DLL是Windows操作系统特有的。为了实现Java与DLL之间的交互,我们需要借助于第三方库。在...

    Java调用Win32获取窗口句柄JNative-1.3.2

    总结来说,Java调用Win32获取窗口句柄JNative-1.3.2是一种使用JNI技术来实现Java与Win32 API交互的方法。通过JNative库,开发者可以轻松地在Java应用程序中查找并操作特定的Windows窗口,增强了Java应用程序的功能和...

    Java本地调用接口 JNative

    - **Java调用本地方法**:通过`native`方法的实例方法调用本地代码。 - **本地代码调用Java方法**:通过JNIEnv指针,本地代码可以访问和调用Java对象的方法,访问Java数组,甚至创建新的Java对象。 6. **JNI数据...

    简单jnative调用dll例子(含dll代码)

    首先定义Java中的JNI接口,然后使用`javah`生成C/C++的头文件,接着编写并编译DLL,最后在Java程序中加载并调用DLL函数。这个过程虽然复杂,但是一旦熟悉了,就能灵活地在Java和本地代码之间建立桥梁,充分利用两者...

    Java调用dll文件开源组件jar包及说明文档

    总结来说,`JNative-1.3.2`是Java调用DLL和SO文件的利器,通过JNI接口,它消除了Java与本地代码之间的障碍,使得开发者可以灵活地利用已有的C/C++代码资源。正确理解和使用这个开源组件,能够极大地提升开发效率,...

    JAVA如何调用dll:用JNI调用C或C++动态联接库

    以下是使用JNative调用DLL的Java代码示例: ```java package com.tvjody; import org.xvolks.jnative.JNative; import org.xvolks.jnative.Type; import org.xvolks.jnative.exceptions.NativeException; public ...

    Java本地调用接口 JNative.7z

    在这个"Java本地调用接口 JNative.7z"压缩包中,可能包含了相关的库文件和源代码示例,用于演示如何在Java程序中使用JNI技术。 首先,我们来了解一下JNI的基本概念。JNI主要由三部分组成:本地方法接口(JNI ...

    java利用jnative调用DLL.txt

    本文介绍了如何使用JNative库在Java中调用DLL。通过具体的代码示例,展示了如何创建`JNative`实例、设置参数类型、调用DLL函数以及处理返回值。这种技术特别适合于需要高性能计算或需要访问操作系统特定功能的场景。...

    Java调用dll

    Java调用DLL是一种常见的跨语言交互技术,允许Java应用程序利用C++编译的动态链接库(DLL)中的功能。在本场景中,我们有一个Win7 64位系统,使用了1.6版本的JDK,并且用Visual Studio C++创建了一个64位的DLL。以下...

Global site tag (gtag.js) - Google Analytics