本人最近才开始学JAVA,因为要用到C++写的DLL,所以看了一下JNA的使用说明,参考了网上一些范例的源码,但是现在对函数指针这块还是不太会用
这是网上的资料:
通过回调函数实现原生代码调用Java代码
int getValue(int (*fp)(int left,int right),int left,int right){
   return fp(left,right);
}
         C函数中通过函数指针调用外部传入的函数,执行任务。
JNA中这样模拟函数指针:
public static interface Fp extends Callback {
            int invoke(int left,int right);
}
         C函数用如下Java方法声明代表:
public int getValue(Fp fp,int left,int right);
    现在,我们有了代表函数指针int (*fp)(int left,int right)的接口Fp,但是还没有Fp的实现类。
public static class FpAdd implements Fp{
        @Override
        public int invoke(int left, int right) {
            return         left+right;   
        }
}
回调函数说明
        原生函数可以通过函数指针实现函数回调,调用外部函数来执行任务。这就是策略模式。
        JNA可以方便地模拟函数指针,把Java函数作为函数指针传递给原生函数,实现在原生代码中调用Java代码。   请问高手:1、在形参里面定义了Fp fp之后,应该把什么样的变量传进去,是Fp的还是FpAdd?
          2、如果我在主方法中定义了一个Fp类型的变量,想把回调函数的地址放进这个变量,应该怎么操作?又或者说回调函数的地址到底应该怎样获得?
 

解决方案 »

  1.   


    额~~还有一个问题啊
       Java调用回调函数的问题是解决了,但是如果dll里面有SetTimer()时,对应的TimeProc函数却不会再Java程序中被执行和体现出来。
        比如我把回调函数指针传进去了,然后在该函数里面用SetTimer()设一个定时器,在定时响应函数TimeProc()中再用传进来的回调函数指针来执行回调函数,可是此时TimeProc()里面的动作在Java程序中均无体现,回调函数自然也没有执行,请问这是什么原因,有什么解决办法?
           我想有可能是像SetTimer这类函数用到操作系统内部资源,而在Java虚拟机中无法获取这类资源?我也不确定啊,不明白其中的机制,有哪位达人知道的来帮忙解答一下吧!