JNI:如何调用c++;来自Java本机方法的函数

JNI:如何调用c++;来自Java本机方法的函数,java,c++,java-native-interface,Java,C++,Java Native Interface,我正在开发一些使用jni的java应用程序。现在我想从JNI方法中调用纯C++函数。我这样做的代码如下所示。这里创建了dll,但当我尝试运行时,出现错误java.lang.UnsatisfiedLinkError:找不到依赖库。我正在visual studio中创建dll。请告诉我调用C++函数时出错了。 这是我的.cpp文件的代码 #include "SensorDetect.h" #include <stdio.h> #include <windows.h> // I

我正在开发一些使用jni的java应用程序。现在我想从JNI方法中调用<强>纯C++函数。我这样做的代码如下所示。这里创建了dll,但当我尝试运行时,出现错误java.lang.UnsatisfiedLinkError:找不到依赖库。我正在visual studio中创建dll。请告诉我调用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();
        }

    }
#包括“SensorDetect.h”
#包括
#包括
//包括特定工具标题
#包括“Tools.h”
//包括IO_X射线USB_MD_VC80头
#包括“IO_XRayUSB.h”
//包括IO_X射线USB_MD_VC80库
#pragma消息(“使用:IO_XRayUSB_MD_VC80.lib”)
#pragma注释(lib,“IO_XRayUSB_MD_VC80.lib”)
////当设备被插入或拔出时,IO_XrayUsb调用的自定义用户回调函数
void _stdcalldevicepluggunplugcallback(X射线_回调*pCallBackInfo,int-nCallBackCount)
{
如果(pCallBackInfo&(nCallBackCount>0))
{
对于(int-nDeviceIndex=0;nDeviceIndex回调设备:%s已插入…\n\n”,pCallBackInfo[nDeviceIndex].pcDeviceName);
打破
机箱X光_USB_未插拔_设备:
printf(“\n=>回调设备:%s已拔出…\n\n”,pCallBackInfo[nDeviceIndex].pcDeviceName);
打破
违约:
打破
}
}
}
}
外部“C”
JNIEXPORT void JNICALL Java_sensordetect_sensordetect_getDevice(JNIEnv*env,jclass cl)
{
常数int nNbMaxDevices=10;
char pDeviceList[nNbMaxDevices][260];
int nDeviceCount=10;
X射线手柄装置;
X射线传感器信息传感器信息;
//int nTriggerMode=GetChoice(1,“选择触发模式:\t0:XVIS_检测1:TWI_请求_检测”);
char-pcBuffer[100];
内坦基;
nKey=0;
int nTriggerMode=nKey;
尝试
{
//X射线_注册表Callbackplug设备被告知设备已插入/拔出
**//此函数调用在加载dll时产生问题。错误:找不到依赖库**
BOOL bSuccess=x光_寄存器CallbackplugDevice(DevicePlugUnplugCallback);
//对于(int-nIndex=0;nIndex<1;nIndex++)
printf(“\t查找设备:%s\n”,pDeviceList[0]);
}
catch(…)//catch-own-CMyException
{
//e、 ShowReason();
}
}

IO_XRayUSB_MD_VC80.dll或其中一个is依赖项不在环境变量
路径中列出的目录中,或者不存在于运行应用程序的同一目录中

要获取DLL所依赖的DLL列表,可以使用:

dumpbin.exe/DEPENDENTS C:\path\to\IO\u XRayUSB\u MD\u VC80.dll


确保在启动程序时指定
-Djava.library.path=C:\path\to\DLLs
选项,和/或在Windows
path

中包含DLL目录,除了不满意的dlinkError之外,您应该尝试使用JNA而不是JNI。它的使用和调试要容易得多。@rob请为JNA教程提供一些好的链接。我正在使用Netbeans启动我的程序,如果只对导致问题的一个方法进行注释,它运行得很好。@AshishDonvir是一个使用不在路径中的DLL的方法。@EJP很好,我能够按照我所提供的所有必要条件创建DLLvisual studio vc++项目属性中的路径。但是,我是否也需要在Netbeans中提供相同的路径集才能使用该dll?我使用Netbeans来启动我的程序,如果只是注释导致问题的一个方法dumpbin.exe没有得到结果,那么它运行良好。任何其他检查依赖项的方法“dumpbin没有得到结果”是什么意思?使用dependency walker,我知道这3个dll在加载我的dll.MSVCR80.dll、IESHIMS.dll、GPSVC.dll时产生了问题。请告诉我应该如何建立我的动态链接库我应该在建立动态链接库时做什么改变。我正在使用MSVS2010创建dll