创建使用另一个DLL并使用JNI访问的DLL

时间:2012-11-14 20:05:33

标签: c++ dll java-native-interface

当我尝试将JNI与我创建的DLL一起使用时,我遇到了问题。

我创建了一个名为InfraredTest.dll的DLL。这个dll引用另一个名为RedRat.dll的dll。 当我尝试在使用RedRat.dll函数的InfraredTest.dll中使用函数时,我从JVM收到致命错误。

观察: 1 - 我已经测试了RedRat.dll链接,创建了InfraRedTest.exe,它使用相同的代码工作正常。 2 - 我已经使用JNI测试了InfraRedTest.dll而没有调用RedRat.dll,也可以正常工作。

我可以看到问题是找不到RedRat.dll。我放在第一个DLL的同一个地方,也收到了JVM崩溃。

以下是代码:

#include "IRWrapper.h"  
#include <iostream>

using namespace std;
using namespace RedRat;
using namespace RedRat::RedRat3;
using namespace RedRat::RedRat3::USB;

JNIEXPORT void JNICALL   
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)  
{  
    printf(" --- Calling IRWrapper.dll --- \n");

    array<LocationInfo^>^ rr3Li = RedRat3USBImpl::FindRedRat3s();
    if (rr3Li->Length == 0)
    {
        printf("No RedRats found.");
    }   else {
        printf("Found: %d devices.\n",rr3Li->Length);
    }
    return;  
}  

1 个答案:

答案 0 :(得分:1)

您的InfraredTest.dll可能与RedRat.lib关联不当。我没有在你的观察中看到最重要的测试场景:模拟整个调用链。 CallingTheSameFunctionsLikeJava.exe InfraredTest.dll,调用RedRat.dll并调用JNI。使用现有测试,您始终只测试一个链接。我敢打赌,一旦这个测试exe工作正常,JNI也不会再有问题了。如果您仍然遇到Java模拟的exe问题,请再次发布问题,但不要使用{{1}}进行标记。