2011-01-30 9 views
2

私はJNAを使用してdllファイルの関数を呼び出しています。以下JNA - ネイティブ関数からコールバック関数への呼び出しを取得できません

機能の1つは、コールバック関数へのポインタを必要と

// Dll function 
void MyFunction (*CallBackFnName); 

へのポインタを通過した後、DLLのAPIによるJavaの

import com.sun.jna.Callback; 
import com.sun.jna.Library; 
import com.sun.jna.Pointer; 

public interface Dll extends Library { 

interface CallBackFnName extends Callback { 
    void callback(Pointer dataBuffer, int dataLen); 
} 


public void MyFunction(Dll.CallBackFnName fn); 
public int StartReading(short arg1, short arg2); 

} 

でJNAプロキシインタフェースでありますコールバック関数を関数MyFunction(* CallBackFnName)、いつでもと呼びます。StartReading()関数はデータをコールバック関数に送信します。

私がそれをしようとしているとき、私のコールバック関数が呼び出されていません。例外をスローしているわけではありません。上記のコードを実行した後

import com.sun.jna.Native; 
import com.sun.jna.Pointer; 

public class Start { 

private static Dll dll = (Dll) Native.loadLibrary("MyDll", Dll.class); 
private static Dll.CallBackFnName fn = new Dll.CallBackFnName() { 
    @Override 
    public void callback(Pointer dataBuffer, int dataLen) { 
     System.err.println("Callback function is called successfully"); 
    } 
}; 

public static void main(String[] args) throws InterruptedException { 
    dll.MyFunction(fn); //passed the pointer to the callback function 
    short arg1 = 0; 
    short arg2 = 0; 
    dll.StartReading(arg1, arg2)); 
    Thread.sleep(10 * 1000); 
} 
} 

、私はコンソールで次のように取得しています::以下

は、私は関数を呼び出していたから、コードがあなたの場合

DeviceAttach: received and accepted attach for vendor id 0x3eb, product id 0x2ffd,   interface 0, device handle 0x037825E8 
Main Menu (active Dev/Prod/Interface/Alt. Setting: 0x3eb/0x2ffd/0/0) 

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e (" 
Read Fail") 

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e (" 
Read Fail") 

Read FailReadWritePipesMenu: WDU_Transfer(control receive) failed: error 0x2000000e (" 
Read Fail") 
Transferred 0 bytes 
0 0 

答えて

0

は知ってはいけませんまだ答えが必要ですが、この問題を抱えている他の人には、 私はこの問題を抱えていました。私は匿名クラスを作成しなければなりませんでした(上記の例を使用して)。

dll.myfunc(new Dll.CallBackFnName() { 
@Override 
public void callback(Pointer dataBuffer, int dataLen) { 
    System.err.println("Callback function is called successfully"); 
} }); 

これは私のために働いた。私は理由を説明することはできません。

関連する問題