使用JNative遇到的小问题

先说一下JNative的使用吧(JNative是封装了访问动态库的相关东西,方便java访问动态库的一个jar包): 
首先:下载JNative(http://sourceforge.net/projects/jnative/)又是sourceforge的东西;


其次:将你需要调用的的动态库放到系统系统盘下的system32或者其他地方(这些其他地方你可以查一下,WEB 项目则将动态库拷贝到容器的bin目录下,如tomcat的bin下 );


再次: 建立一个java项目,在项目中调用动态库,我这里粘贴一个我的例子供参考:

 

package com.gxmis.password;

import org.jasig.cas.authentication.handler.PasswordEncoder;
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.MemoryBlock;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

 

//这是CAS里要使用的一个加密类,我实现了PasswordEncoder 的接口

 public class AccPasswordEncoder implements PasswordEncoder {
  public AccPasswordEncoder(){
   
  }

//重写的加密方法
  public String encode(String pass) {

      //定义JNative
       JNative jn = null;

      //返回密码的长度
       int retInt ;

       //返回的密码字符串
       String retPass = "";

   try {
    

   //申请一个内存块,因为要将加密后的数据取回来用,所以将加密后的数据放在这个内存块,方便返回的时候取出
    MemoryBlock m = MemoryBlockFactory.createMemoryBlock(1024);

   //指向内存块的指针
    Pointer pp = new Pointer(m);
    

    //设置日志记录的开启,方便跟踪JNative的运行过程
    JNative.setLoggingEnabled(true);

   //加载系统system32目录下的动态库
    System.loadLibrary("encrypt");

    //将动态库的名字和方法传递给JNative
    jn= new JNative ("encrypt","encrypttext");
    

   //设置调用动态库的方法后的返回类型(即encrypttext方法的返回类型)
    jn.setRetVal(Type.INT);
    
    int passLen = pass.length();
 
    int intOut = 2 * passLen + 16;
 

    //注意,我的encrypttext方法是有4个参数的,返回值为整型,第0,2个参数是字符串,第1,3个是整形
          jn.setParameter(0, pass);
          jn.setParameter(1, passLen);
          jn.setParameter(2, pp);
          jn.setParameter(3, intOut);
     

   //调用encrypttext方法     
          jn.invoke();
     

  //获得返回值     
          intOut = Integer.parseInt(jn.getRetVal()); 
 
          if (intOut == -1){
           jn.dispose();
           retPass = ""; 
          }
          else{
           jn.dispose();

          //取得加密数据
           retPass = pp.getAsString().substring(0,6);    
          }      
   } catch (NativeException e) { 
    System.out.println("NativeException异常:");
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    System.out.println("IllegalAccessException异常:");
    e.printStackTrace();
   }finally{
    try {
     jn.dispose();
    } catch (NativeException e) {
     e.printStackTrace();
    } catch (IllegalAccessException e) {
     e.printStackTrace();
    } 
   }
   return retPass;
  }
 

}


我自己是调用动态库进行加密的操作:


遇到的问题1:

这个问题是找不到日志文件的异常,但是加密已经完成,从数据可以看出来:

 
2009-11-5 10:43:01, [DEBUG] [org.xvolks.jnative.JNative] [loadLibrary]: Successfully loaded library 'encrypt', functionName = encrypttext: hModule = 268435456 
1af154(这个是加密后出现的数据)java.lang.NoSuchFieldError: lastError 
at org.xvolks.jnative.JNative.nInvoke(Native Method) 
at org.xvolks.jnative.JNative.invoke(JNative.java:807) 
at com.passkey.AccPasswordEncoder.encode(AccPasswordEncoder.java:50) 
at com.passkey.test.main(test.java:10) 
2009-11-5 10:43:01, [DEBUG] [org.xvolks.jnative.JNative] [unLoad]: Unloading native library 'encrypt' 
ccx_jni_utils.c.writeLog : can't get a Java Logger instance. 
Exception in thread "main" 
解决办法:这个问题是jar包的原因,更新新版本的JNative.jar包就可以解决 

遇到的问题2:

JVM的问题:


# An unexpected error has been detected by Java Runtime Environment: 

#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x02e37b1a, pid=4008, tid=456 

Java VM: Java HotSpot(TM) Client VM (1.6.0-beta2-b86 mixed mode, sharing) 
# Problematic frame: 
# C  [IC_WS_CPU.dll+0x7b1a] 

# If you would like to submit a bug report, please visit: 
#   http://java.sun.com/webapps/bugreport/crash.jsp 

解决办法:是JDK版本的原因,注意要更新JDK的版本,1.5以下的可能会出现一些异常,更新到1.6的正式发布版本(尽量不使用测试版本)就好了

遇到的问题3:

我看网上还有个问题是:

开发一个web的时候,一个类用了JNative,JNativeCpp.dll文件发到了windows/system32下面, 
junit 也测试通过了,实际调用的时候报了个 
java.lang.IllegalStateException: JNative library not loaded, sorry ! 
  at org.xvolks.jnative.JNative. <init>(JNative.java:337) 
  at org.xvolks.jnative.JNative. <init>(JNative.java:269) 
.... 
的错误, 

后来把JNativeCpp.dll拷到tomcat的bin下面就解决了。 

不过,不知道了解里面的机制。

 

我也试了一下不用将JNativeCpp.dll拷贝到相应的目录,因为最新的JNative.jar包里面是打包了JNativeCpp.dll文件,所以这个问题在新版本我是没有遇到。

转载:http://blog.163.com/wex660@126/blog/static/24153065201031554358152/


问题3的报错,我遇到的情况是,dll文件32位和64位的问题。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值