0

作成したDLLでJNIを使​​用しようとすると、問題が発生します。

InfraredTest.dllというDLLを作成しました。このdllは、RedRat.dllと呼ばれる別のdllを参照しています。RedRat.dll関数を使用するInfraredTest.dll内の関数を使用しようとすると、JVMから致命的なエラーが発生します。

観察:1-私はすでにRedRat.dllリンクをテストし、InfraRedTest.exeを作成しましたが、同じコードで正常に動作します。2-私はすでにRedRat.dll呼び出しなしでJNIを使​​用してInfraRedTest.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;  
}  
4

1 に答える 1

1

に対して不適切InfraredTest.dllにリンクされている可能性がありますRedRat.lib。あなたの観察では、最も重要なテスト シナリオが見当たりません。つまり、呼び出しチェーン全体をシミュレートすることです。を呼び出しCallingTheSameFunctionsLikeJava.exeInfraredTest.dllそれが呼び出しますRedRat.dll。既存のテストでは、常にチェーン リンクを 1 つだけテストします。このテスト exe が正しく機能するようになれば、JNI にも問題が発生しなくなるはずです。Java でシミュレートされた exe にまだ問題がある場合は、もう一度問題を投稿してくださいJNI

于 2012-11-15T16:59:03.417 に答える