使用JNA从Java调用DLL

使用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

我不熟悉使用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 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#代码中对其进行内部调用(通过以下方式绕过该方法很简单:

有了C语言,效果很好,有了VB.NET和F,我没有经验。
希望这有帮助!

经过大量研究,确认不可能使用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);
}