2012-05-14 102 views
0

我正在使用jni的一些java应用程序。那么现在我想从JNI方法调用纯C++函数。以及我正在做这个如下面的代码所示。这里创建的DLL,但是当我试图运行我得到错误java.lang.UnsatisfiedLinkError:无法找到依赖库。我正在Visual Studio中创建我的dll。所以告诉我我在调用C++函数时做错了什么。JNI:如何从Java Native方法调用C++函数

这里是我的.cpp文件

#include "SensorDetect.h" 
#include <stdio.h> 
#include <windows.h> 
// Include specific Tools header 
#include "Tools.h" 
    // Include IO_XRayUSB_MD_VC80 header 
#include "IO_XRayUSB.h" 

// Include IO_XRayUSB_MD_VC80 library 
#pragma message ("Using : IO_XRayUSB_MD_VC80.lib") 
#pragma comment(lib, "IO_XRayUSB_MD_VC80.lib") 

//// Custom user Callback function which is called by IO_XrayUsb when a device is plugged or unplugged 
void _stdcall DevicePlugUnplugCallback(XRay_CALLBACK * pCallBackInfo, int nCallBackCount) 
{ 
    if (pCallBackInfo && (nCallBackCount > 0)) 
    { 
     for (int nDeviceIndex = 0; nDeviceIndex < nCallBackCount; nDeviceIndex ++) 
     { 
      switch(pCallBackInfo[nDeviceIndex].nState) 
      { 
       case XRAY_USB_PLUGGED_DEVICE : 
        printf("\n=>Callback Device: %s has been Plugged...\n\n", pCallBackInfo[nDeviceIndex].pcDeviceName); 
        break; 
       case XRAY_USB_UNPLUGGED_DEVICE : 
        printf("\n=>Callback Device: %s has been Unplugged...\n\n", pCallBackInfo[nDeviceIndex].pcDeviceName); 
        break; 
       default: 
        break; 
      } 
     } 
    } 
} 


extern "C" 
JNIEXPORT void JNICALL Java_sensordetect_SensorDetect_getDevice(JNIEnv * env, jclass cl) 
{ 

    const int nNbMaxDevices = 10; 
    char pDeviceList[nNbMaxDevices][260]; 
    int nDeviceCount = 10; 
    XRay_HANDLE hDevice; 
    XRay_SENSOR_INFO SensorInfo; 


    //int nTriggerMode = GetChoice(1, "Choose Trigger Mode:\t0:XVIS_detection 1:TWI_request_detection"); 
    char pcBuffer[100]; 
    int nKey; 

     nKey=0; 

      int nTriggerMode=nKey; 

    try 
    { 
     // XRay_RegisterCallBackPlugDevice to be notified of device plug/unplug 
**//This function call creates problem in loading dll. error:Can't find dependent libraries** 
    BOOL bSuccess = XRay_RegisterCallBackPlugDevice(DevicePlugUnplugCallback);  


     //for (int nIndex = 0; nIndex < 1; nIndex ++) 
      printf("\tFound device : %s\n", pDeviceList[0]); 

    } 
    catch (...) // catch own CMyException 
     { 
      //e.ShowReason(); 
     } 

    } 
+0

除了UnsatisfiedLinkError,你应该尝试使用JNA而不是JNI。使用和调试更容易。 – rob

+0

@rob请为我提供一些JNA教程的好链接。 – Jony

回答

1

无论IO_XRayUSB_MD_VC80.dll或者是家属之一的代码是不是在PATH环境变量中列出的目录中,或在同一个目录不存在的地方应用正在运行。

要获得DLL列表上一个DLL取决于您可以使用dumpbin.exe

dumpbin.exe /DEPENDENTS C:\path\to\IO_XRayUSB_MD_VC80.dll

+0

好吧,我使用NetBeans启动我的程序,它运行良好,如果只是评论说,一个方法,这是造成问题 DUMPBIN.EXE没有得到一个结果,任何其他的方法来检查你是什么意思依赖 – Jony

+0

通过“DUMPBIN没有按”吨得到一个结果“? – hmjd

+0

使用的Dependency Walker我得到知道这3个dll被加载在我的dll.MSVCR80.DLL,IESHIMS.DLL,GPSVC.DLL产生问题。请告诉我应该如何构建我的dll在创建dll时应该做些什么改变。我使用MSVS2010创建DLL – Jony

1

确保您启动程序时指定-Djava.library.path=C:\path\to\DLLs选项,和/或包含的DLL在Windows目录PATH

+0

好吧,我使用NetBeans启动我的程序,它运行良好,如果只是评论说,一个方法,这是造成问题。 – Jony

+0

@AshishDonvir使用不在路径中的DLL的一种方法。 – EJP

+0

@EJP很好,我能够做的dll,因为我给了在Visual Studio VC++项目属性所需的所有路径。但是,我是否也需要在Netbeans中同样设置一组路径才能使用该dll? – Jony