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

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

时间: 2024-10-27 23:16:02

JAVA调用动态链接库DLL之JNative学习的相关文章

JAVA调用动态链接库DLL:JNative学习

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.sourcef

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:"在Java项目中必须使用其提供的用.net写的DLL加密机制!" 环境与工具: ◆.net framework 3.5 C# ◆java jdk1.5, Tomcat 5.5 ◆jacob-1.15-M3 实现例子: 一.C# 制作Com组件 新建一个Class 项目,取名TestCom 代码 using System;  using System.Collections.Generic;  us

c++-C++/MFC调用动态链接库DLL

问题描述 C++/MFC调用动态链接库DLL 我用MFC制作了一个DLL动态链接库,然后用另外一个MFC程序区调用它,但是没有效果.其程序如下: 制作一个MFC生成DLL程序,改DLL内部封装了一个函数.如下(.cpp文件): int sum(int a,int b) { char temp[200]; itoa((a+b),temp,10); CString c; c=temp; MessageBox(NULL,c,"提示",0); return a+b; } 调用DLL的代码为:

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

关于c#调用动态链接库DLL的参数设置

问题描述 libeay32.dll-------------------------------------------函数原型:voidAES_decrypt(constunsignedchar*in,unsignedchar*out,constAES_KEY*key)AES_KEY:structaes_key_st{#ifdefAES_LONGunsignedlongrd_key[4*(AES_MAXNR+1)];#elseunsignedintrd_key[4*(AES_MAXNR+1)]

VS2010编写动态链接库DLL及单元测试用例,调用DLL测试正确性

本文将创建一个简单的动态链接库,并编写一个控制台应用程序使用该动态链接库,该动态链接库为"JAVA调用动态链接库DLL之JNative学习"中使用的DLL,只是项目及文件名称不同. 创建动态链接库项目:1.打开Microsoft Visual Studio 2010,选择文件->新建->项目. 2.在新建项目窗口中选择其他语言->Visual C++->Win32. 3.选择Win32 项目,设置名称:simpleDLL,设置解决方案名:simpleDLL.4.

java 如何调用mwrf32.dll

问题描述 java 如何调用mwrf32.dll mwrf32.dll据说是ic读卡器的通用开发dll, 调用这个里边的方法都需要传递一个设备标识的字段, 这个字段是怎么获取的,我的环境是window8. 希望做过类似读卡器开发的大神帮助一下 解决方案 http://www.open-open.com/home/space-37924-do-blog-id-5681.html 解决方案二: java 调用user32.dll 锁定电脑使用ctypes调用kernel32.dll中的函数10.4.

Java如何调用C++ DLL库_java

 最近做了一个网页端人脸识别的项目,用c++写了人脸识别的算法,但是在网页端要使用java后台,这其中就涉及到了java调用dll的问题.下面是小编通过查阅相关资料,实现的一个简单例子. 1.第一步,先在Java中新建一个类 如上图,其中注意这句System.loadLibrary("javaCallcpp");,这就是加载dll文件的代码了.然后我们需要dll中实现下面定义的加减乘除方法. 2.编译文件,文件名为Java2cpp.java,首先编译成class文件,如果用的是ecli

c#-请问如何实现C#调用C++ dll动态链接库

问题描述 请问如何实现C#调用C++ dll动态链接库 通过C# 调用 C++ 的JNetLogin方法: 下面是C#的调用方法,但是一直报错,可能是参数的问题.请问如何修改下面的代码,谢谢! [DllImport("JNetSDK.dll")] public static extern long JNetLogin(string lpszIP, int iDevPort, string lpszUser, string lpszPassword, int iTimeOut, fcbJ