2014-09-01 01:09:38 bojie5744 阅读数 2713

首先得下载JNative,JNAtive感觉挺方便的。

地址为:http://download.csdn.net/detail/bojie5744/7848355免费下载

或者点击官方网站下载

下面为教程代码:(完整netbean测试工程(http://download.csdn.net/detail/bojie5744/7848361),带DLL,方便测试是否成功)

//复制以下代码到创建的项目中,根据自己的项目名称修改下面的package
//Eclipse下默认不生成package可以删除这句话。
package javaexdll;//
//import下面的包,前提记得把jnative.JAR导入到工程内,怎么导入你懂的。工程运行完毕会生成JNativeCpp.dll在项目的目录
import java.util.logging.Level; 
import java.util.logging.Logger;  
import org.xvolks.jnative.JNative;  
import org.xvolks.jnative.Type;  
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;  

/*
by bojie 2014-8-31 23:46:22 ArceTime
*/
public class JavaExDLL 
{
    private  static  String dll_name ="TestDLL";  
    public static void main(String[] args) throws NativeException, IllegalAccessException
    {
       //DLL中的Add函数是实现了两个整形数相加。
       JNative jnative = new JNative(dll_name,"Add");  //创建一个JNative对象。用来调用dll
       jnative.setRetVal(Type.INT);//设置dll中对应的函数返回值 ,为空则设置为Type.VOID
       int i = 0;
       jnative.setParameter(i,6);//设置参数,第一个为参数顺序。0则为第一个参数为6
       ++i;
       jnative.setParameter(i,100);//第二个参数为100
       jnative.invoke();  //执行dll中的函数
       System.out.print(jnative.getRetValAsInt());//获取返回值并显示
    }
    
}



2012-04-12 20:22:10 aimsam 阅读数 2574
独立博客无聊记

1,下载JNative.jar
2,按照下面demo调用就好,省去JNI的麻烦事
根据网上的资料说要什么jnative的dll..我是win7的环境,装过VS之类的一大堆东西没有用到,不知道是不是这个原因。
packagecom.wuliaoji.bean;
importorg.xvolks.jnative.JNative;
importorg.xvolks.jnative.Type;
importorg.xvolks.jnative.exceptions.NativeException;
publicclassTest {
publicstaticvoidmain(String argv[])throwsNativeException, IllegalAccessException {
System.load("D:\\TOOLS2\\VC6\\Microsoft Visual Studio\\MyProjects\\test\\Debug\\test.dll");//InterfaceFun是dll文件
//参数说明InterfaceFundll名,AddZhiYe函数名
JNative jnative =newJNative("test.dll","SAY");
//设置此函数的返回值
jnative.setRetVal(Type.STRING);
inti=0;
//赋予参数值
jnative.setParameter(i++, Type.STRING,"11ddddasd萨顶顶");
// jnative.setParameter(i++, Type.INT, "2");
//函数执行
jnative.invoke();
//打印函数返回值
System.out.println(jnative.getRetVal());
}
}
dll的部分代码
extern "C"  _declspec(dllexport) int ADD(int a, int b)
{
     return a + b;//ok
}

extern "C"  _declspec(dllexport) CString SAY(char *a)
{

     

     return a;//ok
}

extern "C" _declspec(dllexport) CString SAY2(char * str)
{
     CString strtest = "ada";
     return str + strtest;
}
2009-09-10 14:13:00 zjutsoft 阅读数 1483

 

要把操作的dll文件放到 c:windows system32目录下。

 

代码:

 

import org.xvolks.jnative.JNative;
 import org.xvolks.jnative.Type;
 import org.xvolks.jnative.exceptions.NativeException;
 import org.xvolks.jnative.pointers.Pointer;
 import org.xvolks.jnative.pointers.memory.HeapMemoryBlock;
 import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.misc.basicStructures.INT64;
 import org.xvolks.jnative.misc.basicStructures.LONG;
 import org.xvolks.jnative.misc.basicStructures.HWND;
 import org.xvolks.jnative.misc.basicStructures.LPARAM;
 import org.xvolks.jnative.misc.basicStructures.HANDLE;
import org.xvolks.jnative.util.Callback;
 
public class catchDLL2 {
 private static JNative v = null;
 
 /**
 * 加载的DLL
 */
 private static final String DLL_LIB = "BxADLL.dll";


 
// 强制关机
 static void SetScreenState(int a){
  int i=0;
  try{
   v = new JNative(DLL_LIB, "SetScreenState");
   Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   v.setParameter(i++,1);
   v.setParameter(i++,a);
   p.setStringAt(0,"ScreenStateData1");
   v.setParameter(i++,p);
   v.invoke();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 //设置亮度
 static void SetScreenLight(int a){
  int i=0;
  try{
   v = new JNative(DLL_LIB, "SetScreenLight");
   Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   v.setParameter(i++,1);
   v.setParameter(i++,a);
   p.setStringAt(0,"ScreenLight1");
   v.setParameter(i++,p);
   v.invoke();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
  //设置显示屏参数
 static void SetScreenParameter() throws NativeException, IllegalAccessException{
  int i = 0;
  v = new JNative(DLL_LIB, "SetScreenParameter");
  Pointer p3 = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
  
  p3.setStringAt(0,"ParametetData1");
  //设置参数
  v.setParameter(i++,1);
  
  v.setParameter(i++,64);
  v.setParameter(i++,32);
  v.setParameter(i++,2);
  v.setParameter(i++,2);
  v.setParameter(i++,0);
  v.setParameter(i++,0);
  v.setParameter(i++,p3);
  
  //设置返回值类型
  //v.setRetVal(Type.INT);
  v.invoke();
 
  
 }
 //发送命令   参数是包含命令的文件
 static int SendDataToComm(String pchar,int i){
  int ret=1;
  try{
  v = new JNative(DLL_LIB, "SendDataToComm");
  System.out.println(v.getDLLName());
  Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
  Pointer p2 = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
  
  //设置参数
  v.setParameter(0,1);
  
  v.setParameter(1,i);
  v.setParameter(2,64);
  v.setParameter(3,32);
  v.setParameter(4,2);
  p.setStringAt(0,"Com1");
  v.setParameter(5,p);
  v.setParameter(6,57600);
  p2.setStringAt(0,pchar);
  v.setParameter(7,p2);
  
  //设置返回值类型
  v.setRetVal(Type.LONG);
  v.invoke();
  //System.out.println("LED设备="+p2.getAsString());
   ret = Integer.parseInt(v.getRetVal());
  }catch(Exception e){
   e.printStackTrace();
  }
  return ret;
 }
 //取得发送全部显示屏数据的数据头信息,在添加显示区域信息前添加。
 static void GetAllDataHead(){

  try{

   int i = 0;
   v = new JNative(DLL_LIB, "GetAllDataHead");
   /*Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   
   p.setStringAt(0,"SendAllDataHead1");*/
   //设置参数===================
   
   //显示屏屏号
   v.setParameter(i++,1);
   //显示屏中区域的个数
   v.setParameter(i++,2);
   //字幕区域的宽度
   v.setParameter(i++,64);
   //字幕区域的高度
   v.setParameter(i++,32);
   //显示屏类型
   v.setParameter(i++,2);
   
   //字幕区域信息保存的文件名;
   v.setParameter(i++,"SendAllDataHead1");
   
   
   //设置返回值类型
   //v.setRetVal(Type.INT);
   v.invoke();
  
   
  
  }catch(Exception e){
   e.printStackTrace();
  }
 
 }
 //合并显示区域信息文件 
 static void UnionAreaDataToFile(int a,int b,String file,int c){


  try{

   int i = 0;
   v = new JNative(DLL_LIB, "UnionAreaDataToFile");
   /*Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   Pointer p1 = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   p.setStringAt(0,file);
   p1.setStringAt(0,"SendAllData1");*/
   //设置参数===================
   
   //pSourceFile是否是区域文件;1:区域文件;0:非区域文件;
   v.setParameter(i++,a);
   //区域序号;从1开始;
   v.setParameter(i++,b);
   //预合并信息文件名称
   v.setParameter(i++,file);
   //合并目标文件名称。
   v.setParameter(i++,"SendAllData1");
   //0:在原文件下添加合并信息文件;1:删除原文件信息,重新创建合并信息文件
   v.setParameter(i++,c);
   
   
   
   //设置返回值类型
   //v.setRetVal(Type.INT);
   v.invoke();
  
   
  
  }catch(Exception e){
   e.printStackTrace();
  }
 
 
 }
 //转换 字幕区域显示信息 SendDataTitle1 D1
 static void SetScreenTitle(int nAreaOrdID,int x,int y,int hight,int big,String pTitle,int nStunt,int nRunSpeed,int nShowTime){
  try{
   
   int i = 0;
   v = new JNative(DLL_LIB, "SetScreenTitle");
   Pointer p = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   //Pointer p1 = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   Pointer p2 = new Pointer(MemoryBlockFactory.createMemoryBlock(100));
   p.setStringAt(0,"宋体");
   //p1.setStringAt(0,pTitle);
   p2.setStringAt(0,"SendDataTitle1");
   //设置参数===================
   
   //区域序号
   v.setParameter(i++,nAreaOrdID);
   //字幕区域的横坐标
   v.setParameter(i++,x);
   //字幕区域的纵坐标
   v.setParameter(i++,y);
   //字幕区域的长度
   v.setParameter(i++,64);
   //字幕区域的高度
   v.setParameter(i++,hight);
   //显示屏类型
   v.setParameter(i++,2);
   //点阵类型
   v.setParameter(i++,1);
   //字幕区域显示字体
   v.setParameter(i++,p);
   //字幕区域显示字号
   v.setParameter(i++,big);
   //字幕区域显示颜色; 1:红色;2:绿色;3:黄色
   v.setParameter(i++,1);
   //粗体;1:粗体;0正常
   v.setParameter(i++,0);
   //斜体;1:斜体;0正常
   v.setParameter(i++,0);
   //下划线;1:下划线;0正常
   v.setParameter(i++,0);
   //字幕区域显示的字幕滚动信息
   v.setParameter(i++,pTitle);
   //字幕区域显示特技;具体特技特征字见注1;
   v.setParameter(i++,nStunt);
   //字幕区域信息运行速度
   v.setParameter(i++,nRunSpeed);
   //字幕区域信息停留时间
   v.setParameter(i++,nShowTime);
   //字幕区域信息保存的文件名;
   v.setParameter(i++,p2);
   
   
   //设置返回值类型
   //v.setRetVal(Type.INT);
   v.invoke();
  
   
  
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 
 //设置亮度
 static void setLight(int a){
        //设置亮度 SetScreenLight(1--15) ScreenLight1
  SetScreenLight(a);
  int ret=SendDataToComm("ScreenLight1",0xc8); 
  if(ret==1) System.out.println("亮度设置发送成功");
  else System.out.println("亮度设置发送失败");
 }
 
 //强制开关机
 static void setState(int a){
  //强制开关机 SetScreenState(1表示开机  0表示关闭); ScreenStateData1
  SetScreenState(a);
  int opendown=SendDataToComm("ScreenStateData1",0xC4); 
  if(opendown==1) System.out.println("开关机发送成功");
  else System.out.println("开关机发送失败");
  
 }
 
 //设置屏参
 static void setParameter() throws NativeException, IllegalAccessException{
  //设置显示屏参数 SetScreenParameter(); ParametetData1
  SetScreenParameter();
  int par=SendDataToComm("ParametetData1",0xC1); 
  if(par==1) System.out.println("显示屏参数发送成功");
  else System.out.println("显示屏参数发送失败");
  
 }
// UnionAreaDataToFile 1:区域文件;0:非区域文件; 区域序号;从1开始;
 //0:在原文件下添加合并信息文件;1:删除原文件信息,重新创建合并信息文件
 //发送字幕 message1显示上面  message2显示下面
 public static void SendMessage(String message1,String message2){
  GetAllDataHead();
  UnionAreaDataToFile(0,0,"SendAllDataHead1",1);
  //16是字幕显示高度 12是字体大小
  SetScreenTitle(1,0,0,16,12,message1,1,1,2);
  UnionAreaDataToFile(1,1,"SendDataTitle1",0);
  
  SetScreenTitle(2,0,16,16,12,message2,1,1,2);
  UnionAreaDataToFile(1,2,"SendDataTitle1",0);
  //设置字幕 SetScreenTitle(); SendDataTitle1
  //SetScreenTitle();
  int title=SendDataToComm("SendAllData1",0xD1); 
  if(title==1) System.out.println("向显示屏发送数据成功");
  else System.out.println("向显示屏发送数据失败");
 }
 
// 发送字幕 message1显示上面 全屏显示
 public static void SendOne(String message1){
  GetAllDataHead();
  UnionAreaDataToFile(0,0,"SendAllDataHead1",1);
  
  SetScreenTitle(1,0,0,32,24,message1,1,1,2);
  UnionAreaDataToFile(1,1,"SendDataTitle1",0);
  
  
  //设置字幕 SetScreenTitle(); SendDataTitle1
  //SetScreenTitle();
  int title=SendDataToComm("SendAllData1",0xD1); 
  if(title==1) System.out.println("向显示屏发送数据成功");
  else System.out.println("向显示屏发送数据失败");
 }
 
 public static void main(String[] args) {
  
  try{
   //1~15  亮度增加
   //setLight(1);
   //0关机 1 开机
   //setState(1);
   //设置屏参
   //setParameter();
   
   SendMessage("浙A-T56865","杭州威玛计算机系统有限公司");
   //SendOne("中国你好");
  }catch(Exception ne){
   System.err.println("listAllDevice NativeException!");
   //releaseCard();
   ne.printStackTrace();
  }
  
 }

}

2011-08-15 11:32:36 iteye_9620 阅读数 61
由于项目要求,需要用Java调用windows的dll文件,查了一下,如果用JNI的话是比较麻烦的,在sourceforge.net上搜索了一下 “Java dll”,首先出现的是Jnative,于是决定用它,后来也试了些别的,但还是JNative好使,简单总结如下:

Java调用动态库所需要关心的问题:
l 如何装载dll文件,以及如何定位所要使用的方法;

l 数据类型是如何对应的;

l 如何给使用的方法传递参数;

l 如何获取返回的值。

JNative INFO:
Resource URL: http://jnative.sourceforge.net/

Source Code: http://sourceforge.net/projects/jnative

Detailed Review: http://jnative.free.fr

JavaDOC: http://jnative.free.fr/docs/

Version:1.3

一个开源的组件,通过它调用已有动态库中的方法就非常的方便,支持CallBack 。

为什么选择JNative
同类的开源组件相对活跃的还有,JNA ( Java Native Access ), Jawin,Nativecall,etc.但是Jnative 相对更容易使用,它对数据类型的处理做的更好。

l JNA 需要用户对所使用的DLL文件事先进行封装,才能装载。另外需要在一个java接口中描述目标DLL中的函数与结构,从而使JNA自动实现Java接口到native function的映射,较麻烦。

l Nativecall 暂时还不知道如何装载dll文件。

l Jawin 数据类型匹配相当敏感,它采用一种叫做”instruction string”的格式来传递参数,还没有完全理解。

How to:
解压JNative-1.3.2.zip 获得三个文件,分别是:JNativeCpp.dll,libJNativeCpp.so,JNative.jar 。


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

libJNativeCpp.so Linux下的咚咚;

JNative.jar 这是一个扩展包,将其copy到C:\jdk\jre\lib\ext 下(我的目录结构),系统会自动加载。

结构映射(Structure Mapping)


Type
Length
JNative class

DWORD
4
org.xvolks.jnative.misc.basicStructures.LONG

HWND
4
org.xvolks.jnative.misc.basicStructures.HWND

COLORREF
4
org.xvolks.jnative.misc.basicStructures.LONG

COLORREF*
4
org.xvolks.jnative.pointers.Pointer

LPARAM
4
org.xvolks.jnative.misc.basicStructures.LPARAM

LPCCHOOKPROC
4
org.xvolks.jnative.util.Callback

LPCTSTR
4
org.xvolks.jnative.pointers.Pointer


一些关键的类及方法

Class
作用
一般用到的方法(参数略,参考Doc)

org.xvolks.jnative.Jnative
装载dll文件,定位函数
JNative(),setParameter(),setRetVal(),getRetVal() etc.

org.xvolks.jnative.pointers.Pointer
替代本地函数中的的指针,需要先申请一块内存空间,才能创建
Pointer(),dispose()

org.xvolks.jnative.pointers.memory.MemoryBlockFactory
申请一块内存空间
createMemoryBlock()

org.xvolks.jnative.exceptions.NativeException
抛出装载,定位等方面的异常


org.xvolks.jnative.Type
列举和管理Jnative需要的不同的数据类型


(二)

简单测试,Javadoc 下和官方网上有些例子,下面的是我随便从IC读卡程序中找了个DLL进行的测试:
SCReader.dll 下的SCHelp_HexStringToBytes()函数原型
SCREADER_API WINAPI long SCHelp_HexStringToBytes(

LPCTSTR pSrc,

BYTE* pTar,

int MaxCount

);

注意:dll文件需要放到System32下,否则可能找不到


通过Jnative 用java 来调用代码如下:

package onlyfun.dllcall;
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;
import org.xvolks.jnative.Type;
public class UserCall {
/**
* return 转换成功的字节数
*/
static JNative Something = null;
static Pointer pointer;
public String getSomething(String pSrc, Pointer pTar, int MaxCount) throws NativeException, IllegalAccessException{

try{
if(Something == null){
pTar = new Pointer(MemoryBlockFactory.createMemoryBlock(36));
Something = new JNative("SCReader.DLL", "SCHelp_HexStringToBytes");
// 利用org.xvolks.jnative.JNative 来装载 SCReader.dll,并利用其SCHelp_HexStringToBytes方法
Something.setRetVal(Type.INT);
// 指定返回参数的类型
}
int i=0;
Something.setParameter(i++,pSrc);
Something.setParameter(i++,pTar);
Something.setParameter(i++,MaxCount);
System.out.println("调用的DLL文件名为:"+Something.getDLLName());
System.out.println("调用的方法名为:"+Something.getFunctionName());
//传值
Something.invoke();//调用方法
return Something.getRetVal();
}finally{
if(Something!=null){
Something.dispose();//释放
}
}
}
public Pointer creatPointer() throws NativeException{
pointer = new Pointer(MemoryBlockFactory.createMemoryBlock(36));
pointer.setIntAt(0, 36);
return pointer;
}

public static void main(String[] args) throws NativeException, IllegalAccessException {
UserCall uc = new UserCall();
String result = uc.getSomething("0FFFFF", uc.creatPointer(), 100);
System.err.println("转换成功的字节数为:"+result);
TestCallback.runIt();
}
}


摘自:http://www.oschina.net/question/12_10956
2011-06-08 16:44:45 cheng_zhi 阅读数 71

 

下载地址:

 

JNative_1.4RC2_src.zip : http://jaist.dl.sourceforge.net/sourceforge/jnative/JNative_1.4RC2_src.zip

 

JNative.jar : http://nchc.dl.sourceforge.net/sourceforge/jnative/JNative.jar

 

如果以上版本不能完成下载,说明版本有可能更新,请从以下地址中下载:

 

Resource URL: http://jnative.sourceforge.net/ 

 

Source Code: http://sourceforge.net/projects/jnative 

 

Detailed Review: http://jnative.free.fr 

 

JavaDOC: http://jnative.free.fr/docs/

 

JNative相对于其它同类开源组件的优点:

 

1.容易使用

 

2.对数据类型的处理做的出色

 

3.支持CallBack

 

下面以一个小Demo来学习一下JNative:

 

1.理解文件用途

 

JNative_1.4RC2_src.zip是JNative源代码的压缩包把它解压后从中找到libJNativeCpp.so和JNativeCpp.dll两个文件.JNativeCpp.dll应用在Windows平台下.把它放在c:\windows\system32目录下.libJNativeCpp.so应用在Linux平台下.放在哪个目录,这个我不知道.

 

把JNative.jar加入到所需的工程中.

 

把要调用的dll文件也放在c:\windows\system32目录下

 

2.测试类

 

package com.xgz.jnative;

 

import org.xvolks.jnative.JNative;

import org.xvolks.jnative.Type;

import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

 

public class Test {

 

public static void main(String[] args)throws Exception {

   //系统加载dll文件有两种写法1.loadLibrary方法:把dll文件拷贝到c:\windows\system32目录下,引用时只需写dll名字2.load方法:写dll文件的完整路径

   System.loadLibrary("InterfaceFun");//InterfaceFun是dll文件

   //参数说明InterfaceFun dll名,AddZhiYe函数名

   JNative jnative = new JNative("InterfaceFun","AddZhiYe");

   //设置此函数的返回值

   jnative.setRetVal(Type.INT);

   int i=0;

   //赋予参数值

   jnative.setParameter(i++, Type.STRING,"127.0.0.1");

   jnative.setParameter(i++, Type.STRING,"sa");

   jnative.setParameter(i++, Type.STRING,"sa");

   jnative.setParameter(i++, Type.STRING,"程序员");

   jnative.setParameter(i++, Type.INT,"23");

   jnative.setParameter(i++, Type.INT,"23");

   //函数执行

   jnative.invoke();

   //打印函数返回值

   System.out.println(Integer.parseInt(jnative.getRetVal()));

}

 

}

使用JNative调用DLL

阅读数 43

java 通过jnative调用dll

阅读数 10441

没有更多推荐了,返回首页