gpt4 book ai didi

java - 使用 JNA 从 Java 调用 DLL

转载 作者:行者123 更新时间:2023-11-30 03:57:46 27 4
gpt4 key购买 nike

我不熟悉使用 JNA 从 Java 访问 DLL。我需要访问 DLL 中的类(用 .net 编写)中的方法。从下面的示例 DLL 中,我尝试获取 AuditID 和服务器 ID。当我运行代码时,我以以下错误结束。非常感谢任何指导。

///错误///

 Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function  'GetEnrollcontext': The specified procedure could not be found.

//DLL文件代码//

SampleDLL.ProfileEnroll enrollcontext = new SampleDLL.ProfileEnroll();
enrollcontext.Url =” url”;
enrollcontext.AuditIdType = SampleDLL.ProfileId;
enrollcontext.AuditId = “22222222 “;
enrollcontext.ServerId = “server1”;

///Java 代码///

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
import dllExtract.DLLExtractTest.SampleDLL.Enrollcontext;


public class SampleDLLExtract {

public interface SampleDLL extends Library {
SampleDLL INSTANCE = (SampleDLL) Native.loadLibrary("SampleDLL",
SampleDLL.class);

public static class Enrollcontext extends Structure {

public String auditId;
public String serverId;
}
void GetEnrollcontext(Enrollcontext ec); // void ();
}
public static void main(String[] args) {
SampleDLL sdll = SampleDLL.INSTANCE;
SampleDLL.Enrollcontext enrollContext = new SampleDLL.Enrollcontext();
sdll.GetEnrollcontext(enrollContext);

System.out.println(sdll.toString(sdll.GetEnrollcontext(enrollContext)));
}
}

最佳答案

事实上,有一个解决方案可以让您通过 Java 中的 JNA 使用 C#、VB.NET 或 F# 代码(仅此而已)!而且它也非常容易使用: https://www.nuget.org/packages/UnmanagedExports

使用此包,您需要做的就是将 [RGiesecke.DllExport.DllExport] 添加到您的方法中,如下所示:

C# .dll 项目:

[RGiesecke.DllExport.DllExport]
public static String yourFunction(String yourParameter)
{
return "CSharp String";
}

Java 项目:

public interface jna extends Library {
jna INSTANCE = (jna) Native.loadLibrary("yourCSharpProject.dll", jna.class);
public String yourFunction(String yourParameter);
}

在代码中使用它:

System.out.println(jna.INSTANCE.yourFunction("nothingImportant"));

中提琴!

正如已经提到的,它工作起来非常简单,但是这个解决方案有一些限制:

  • 仅适用于简单数据类型作为参数和返回值
  • 没有可用的方法重载。 yourFunction(String yourParameter) 和 yourFunction(String yourParameter, String yourSecondParameter) 不起作用!你必须以不同的方式命名它们
  • 使用数组作为参数或返回值。 (JNA 提供了 StringArray,但我无法在 C# 中使用它们)(也许有一种解决方案,但我到目前为止还想不出一个!)
  • 如果导出方法,则无法在 C# 代码中内部调用它(可以通过以下方式简单绕过该方法:

.

[RGiesecke.DllExport.DllExport]
public static Boolean externalAvailable(String yourParameter)
{
return yourInternalFunction(yourParameter);
}

使用 C# 效果很好,使用 VB.NET 和 F# 我没有经验。希望这有帮助!

关于java - 使用 JNA 从 Java 调用 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22695829/

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