使用JNA从Java调用DLL
我不熟悉使用JNA从Java访问DLL。我需要从DLL(用.net编写)中的类访问方法。从下面的示例DLL中,我正在尝试获取试听和服务器ID。在运行代码时,我以以下错误结束。非常感谢您的指导 ///错误///使用JNA从Java调用DLL,java,.net,dll,jna,Java,.net,Dll,Jna,我不熟悉使用JNA从Java访问DLL。我需要从DLL(用.net编写)中的类访问方法。从下面的示例DLL中,我正在尝试获取试听和服务器ID。在运行代码时,我以以下错误结束。非常感谢您的指导 ///错误/// Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'GetEnrollcontext': The specified procedure could not be f
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#代码(而不是其他任何东西)!而且它也非常容易使用: 使用此软件包,您只需将[rgisecke.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#代码中对其进行内部调用(通过以下方式绕过该方法很简单:
希望这有帮助!经过大量研究,确认不可能使用JNA框架调用用VB或C Sharp编写的DLL文件。JNA正在使用系统DLL,但不适用于第三方DLL。感谢您的详细回答。我浏览了jn14net()您有什么建议吗?关于jni4net的建议?不是一般的,抱歉。基本示例看起来不错,但是我想知道如何将它们与其他类一起使用,然后是c类,它们已经包含在jni4net.version.jar中
[RGiesecke.DllExport.DllExport]
public static Boolean externalAvailable(String yourParameter)
{
return yourInternalFunction(yourParameter);
}