gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:49:17 24 4
gpt4 key购买 nike

我尝试从 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。

最佳答案

您必须非常小心名称和导出。

假设您有这个 super 简单的库

// 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

关于java - 如何在Java程序中调用.Net DLL中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56064753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com