如何在Java程序中的.Net DLL中调用方法

时间:2019-05-09 17:35:39

标签: java java-native-interface jni4net

我试图使用Java代码中的.NET DLL,成功加载了 tsMemberFunctions.DLL ,但是代码无法调用实际函数。

请参见下面的代码段

public class tsMemberFunctions {  
    public native void GetMemberJSONSample();

    static {
        System.loadLibrary("tsMemberFunctions");
        System.out.println("Loaded");
    }

    public static void main(String[] args) {
        new tsMemberFunctions().GetMemberJSONSample();

    }
}

执行上述方法时,出现以下错误:

Loaded
Exception in thread "main" java.lang.UnsatisfiedLinkError: tsMemberFunctions.GetMemberJSONSample()V
    at tsMemberFunctions.GetMemberJSONSample(Native Method)
    at tsMemberFunctions.main(tsMemberFunctions.java:12)

有人可以告诉我我是否错过了代码中的任何内容或不正确的内容,或者针对此用例提出了更好的选择。 TIA。

1 个答案:

答案 0 :(得分:0)

您必须非常注意名称和出口。

假设您有这个超级简单的库

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include "jni.h"
#include <stdio.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

extern "C" JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_displayMessage

(JNIEnv* env, jclass obj) {

    printf("Hello world!\n");

}

您必须确保为正确的体系结构构建DLL(这取决于您使用的Java版本-32/64位)。

假设您有x64 DLLx64 JDK,可以这样称呼您的音乐库

package recipeNo001;

public class HelloWorld {

    public static native void displayMessage();

    static {
        System.load("C:\\Users\\your_name\\Source\\Repos\\HelloWorld\\x64\\Debug\\HelloWorld.dll");
    }

    public static void main(String[] args) {
      HelloWorld.displayMessage();
    }
}

对于您而言,我敢打赌您的代码中没有extern "C"-这就是为什么JVM无法找到您的符号的原因。

在工具方面,我建议使用Visual Studio 2019(在创建DLL时)和IntelliJ for Java代码。

您可以在以下位置找到许多示例:http://jnicookbook.owsiak.org/和此处:https://github.com/mkowsiak/jnicookbook