2013-08-28 2 views
0

Java JNA 사용법을 배우고 있으며 Microsoft Kinect SDK에서 간단한 함수를 호출하려고합니다. (NuiGetSensorCount)는 연결된 kinect의 수를 반환합니다. 여기 NuiGetSensorCount Java JNA

내 시도 :

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

public class Driver { 
    public interface KinectLibrary extends Library { 
    KinectLibrary INSTANCE = (KinectLibrary)Native.loadLibrary(("Microsoft.Kinect"),KinectLibrary.class); 

     //_Check_return_ HRESULT NUIAPI NuiGetSensorCount(_In_ int * pCount); 
     NativeLong NuiGetSensorCount(Pointer pCount); 
    } 

    public static void main(String[] args) { 
     Pointer devCount = new Pointer(0); 
     KinectLibrary.INSTANCE.NuiGetSensorCount(devCount); 
     System.out.println("Devices:"+devCount.getInt(0)); 
    } 
} 

하지만 얻을 :

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'NuiGetSensorCount': The specified procedure could not be found. 

at com.sun.jna.Function.<init>(Function.java:208) 
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536) 
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513) 
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499) 
at com.sun.jna.Library$Handler.invoke(Library.java:199) 
at $Proxy0.NuiGetSensorCount(Unknown Source) 
at Driver.main(Driver.java:30) 

는 사람이 올바른 기본 기능을 발견 있도록 코드를 변경하는 방법에 대한 도움을 제공 할 수 있습니까? 또한 약간의 정보/참조를 제공하여 직접 디버깅 (Java JNA의 기능을 확인하고 .dll에 포함 된 것과 비교하는 방법)

답변

0

문제점을 파악했습니다. 먼저 종속성 워커 http://dependencywalker.com/이라는 프로그램을 사용하여 DLL의 모든 심볼을보고 사용중인 DLL (Microsoft.Kinect.dll)이 실제로 호출하려고했던 함수를 포함하지 않았 음을 확인했습니다. 나는 Kinect10.dll이 내가 필요한 것임을 알았다. 그것을 변경 한 후에는 포인터를 약간 변경해야만 완벽하게 작동합니다!

여기 고정 코드가 있습니다.

import com.sun.jna.Native; 
import com.sun.jna.NativeLong; 
import com.sun.jna.ptr.IntByReference; 
import com.sun.jna.win32.StdCallLibrary; 

    public class Driver{ 
    public interface KinectLibrary extends StdCallLibrary { 
     KinectLibrary INSTANCE = (KinectLibrary)Native.loadLibrary(("Kinect10"),KinectLibrary.class); 

     //_Check_return_ HRESULT NUIAPI NuiGetSensorCount(_In_ int * pCount); 
     NativeLong NuiGetSensorCount(IntByReference pCount); 
    } 
    public static void main(String[] args) { 
     IntByReference a = new IntByReference(); 
     KinectLibrary.INSTANCE.NuiGetSensorCount(a); 
     System.out.println("Devices:"+a.getValue()); 
    } 
}