typedef USHORT apiReturn;apiReturn _stdcall ConnectScanner(HANDLE *hScanner, char *szPort, int nBaudRate);上面是VC 的DLL 一个函数的声明,动态库的名字:RFSAPIV2.dll下面是我填的一部分类型声明不知道咋整, 该如何声明呢?
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
  public interface RFSAPIV2 extends Library {        RFSAPIV2 INSTANCE = (RFSAPIV2)
            Native.loadLibrary("RFSAPIV2",
            RFSAPIV2.class);
     
     函数 在这个地方如何声明呢?
    }

解决方案 »

  1.   

    因为这是一个interface 所以 里面的函数都应该是抽象的,即没有方法体的。
    例如:public void test(String str);
      

  2.   

    java语法interface IMyInterface {
      public String showOneString(String str);
    }class MyClass implements IMyInterface {
      public String showOneString(String str){
        System.out.println(str);
      }  public static void main(String[] args){
        IMyInterface instance = new MyClass();
        instance.showOneString("hello world!");
      }
    }
      

  3.   

    这个问题很难么? 看来作为菜鸟的我更没折了,, 网上搜索了老半天了,没啥能切中要害的图书馆,书店翻了半天也是没见到有介绍JNA方法的
      

  4.   

    我记得哪里有类型对比的资料
    那时候弄jna看过你是要什么那个函数?
    我找找以前的资料。
      

  5.   

    我也没仔细看
    你看用不用得上
    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.frJavaDOC: 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();
        }
    }
      

  6.   

    楼上的兄弟,你的是 JNative 方法吧,,,感觉和JNA还是有点不一样,我先看看你的代码吧
    我现在想用的是JNA方法,, 呵呵
      

  7.   

    还没搞定?
    这是 jna 的官网。上面有很多例子。
    https://jna.dev.java.net/
      

  8.   

    谢谢楼上啊 对  typedef USHORT apiReturn; 的声明格式还比较模糊 导致
     apiReturn _stdcall ConnectScanner(HANDLE *hScanner, char *szPort, int nBaudRate);
     
     这个的 JAVA 格式不知道怎么写 哈哈 官方的资料我看了,不得法门
     
      

  9.   

    typedef USHORT apiReturn  这个VC里的声明
    是否用下面的格式代替在JAVA里public static class apiReturn extends Structure
       {
          public short apiReturn;
        }另:VC里的 USHORT   在JAVA 用 int 还是用SHORT 呢?
      

  10.   

    USHORT 定义的是无符号短整形吧。
    java 里面不用定义,直接用 int 就可以。
      

  11.   

    哪位心情好的,帮列列撒最好再 在 MAIN  主过程中给出代码 哈哈 我的可用分还不少地 嘿嘿下午或晚上再来请教,, 谢谢了
      

  12.   

        public static void main(String[] args)  {
         RFSAPIV2.INSTANCE.ConnectScanner(.....);
        }
      

  13.   

    12.1.1 Primitive Types
    The following table describes the primitive types in the Java programming language
    and the corresponding types in the JNI. Like their counterparts in the Java
    programming language, all primitive types in the JNI have well-defined sizes.
    Java Language Type Native Type Description
    boolean jboolean unsigned 8 bits
    byte jbyte signed 8 bits
    char jchar unsigned 16 bits
    short jshort signed 16 bits
    int jint signed 32 bits
    long jlong signed 64 bits
    float jfloat 32 bits
    double jdouble 64 bits
      

  14.   


    下面是VC 里原型typedef USHORT apiReturn;apiReturn _stdcall ConnectScanner(HANDLE *hScanner, char *szPort, int nBaudRate);
    JAVA里如何 应该有 返回的吧? 如果用 JAVA里用 结构代替, 如何写呢?
      

  15.   


    我想说,你这个Dll在java中不能直接用,你必须在java的native 方法编译生成的头文件实现中调用你的dll文件。java只支持Java_开头的方法。所以你的java方法就随意了。参数用(Object o, String s, int i)就行吧。
      

  16.   


    有返回。不过应该是Object吧,或者是你在java 中定义的对等对象,结构体也要写一个java的对等对象
      

  17.   

    楼上的兄弟别给我泼冷水啊 我这个问题是没解决 但我的确试过了 JNA直接调用系统的DLL文件, 是可以的 呵呵
     现在的 RFSAPIV2  这个 DLL 是用VC 写的一个DLL 文件
     
     按网上的描述,应该也是可以直接调用的 
     只是我这个目前还没找到类似的声明,调用参考,,所以还不确定你说的对不对 呵呵